Opracowujemy małą aplikację serwera c. Aplikacja serwera przetwarza dane i odpowiada na klienta. Aby część przetwarzania danych była konfigurowalna i elastyczna, zdecydowaliśmy się na skrypty i na podstawie dostępności różnych gotowych modułów zdecydowaliśmy się na Python. Używamy api Python-C do wysyłania/odbierania danych pomiędzy c i python.Python-C api kwestia współbieżności
Algorytm działa tak: -
- Server odbiera niektóre dane od klienta, to dane są przechowywane w słowniku utworzonego wc. Słownik jest tworzony za pomocą funkcji api PyDict_New(); z c. Dane wejściowe są zapisywane jako para wartości klucza w słowniku za pomocą funkcji api PyDict_SetItemString();
- Następnie uruchamiamy skrypt Pythona PyRun_SimpleString(); przekazanie skryptu jako parametru. Ten skrypt korzysta ze słownika utworzonego w c. Zauważ, że tworzymy słownik utworzony w c, dostępny dla skryptu za pomocą metod PyImport_AddModule(); i PyModule_AddObject();
- Przechowujemy wynik przetwarzania danych w skrypcie jako parę wartości klucza w tym samym słowniku utworzonym powyżej. Kod c może po prostu uzyskać dostęp do zmiennej wyniku (pary klucz-wartość) po wykonaniu skryptu.
Problem Problem mamy do czynienia w przypadku jednoczesnych żądań pochodzących z różnych klientów. Gdy wiele żądań przychodzi od różnych klientów, mamy tendencję do unikania wyjątków liczników odwołań. Pamiętaj, że dla każdego żądania, które pochodzi od użytkownika, tworzymy niezależny słownik dla tego użytkownika. Aby rozwiązać ten problem, objęliśmy wywołanie PyRun_SimpleString(); w PyEval_AcquireLock(); i PyEval_ReleaseLock() ;, ale spowodowało to wykonanie skryptu będącego blokowaniem. Jeśli więc wykonanie skryptu trwa długo, wszyscy pozostali użytkownicy również czekają na odpowiedź.
Czy możesz zaproponować najlepsze możliwe podejście lub podać wskazówki, dokąd zmierzamy źle. Wyślij zapytanie do mnie, aby uzyskać więcej informacji.
Każda pomoc/wskazówki zostaną docenione.
Dzięki za referencję Jane. Nawiasem mówiąc, nawiązywałem połączenia z tymi funkcjami, ale nadal nie będzie działać. – Will