Mam wątek wykonujący wiele intensywnych procesorów, który wydaje się blokować inne wątki. Jak mogę to ograniczyć?Jak mogę dławić wątki Pythona?
To jest specjalnie dla web2py, ale ogólne rozwiązanie byłoby w porządku.
Mam wątek wykonujący wiele intensywnych procesorów, który wydaje się blokować inne wątki. Jak mogę to ograniczyć?Jak mogę dławić wątki Pythona?
To jest specjalnie dla web2py, ale ogólne rozwiązanie byłoby w porządku.
Właściwie właśnie skończyłem nurkować w tej kwestii niedawno, nie będziesz mógł zmienić priorytetu wątku, ale są sposoby obejścia tego.
Aby dać ci odrobinę wiedzy na temat problemu, w implementacji cPython wątki związane z procesorem mogą spowodować, że inne wątki zagłodzą się z powodu sposobu, w jaki Globalna Blokada Interpretera lub GIL zostanie zwolniona i nabyta. Co dziwne, problem ten pogarsza się w środowisku wielordzeniowym. Naprawdę szczegółową analizę i prezentację na ten temat wykonała firma David Beazley, którą można znaleźć pod numerem http://www.dabeaz.com/python/GIL.pdf. Ma kilka postów na blogu, które zawierają bardziej szczegółowe informacje. Są długie, ale fascynujące.
Krótka wersja jest to, że wątek związany z procesorem zwalnia i ponownie GIL, zanim inne wątki mogą zostać obudzone, aby go pobrać. Powoduje to, że wątek związany z procesorem trzyma GIL przez ponad 90% czasu.
Istnieje kilka wzorów, których można użyć do obejścia tego problemu. Na przykład można uruchomić zadania związane z procesorem w zupełnie innym procesie. Dzięki temu program planujący systemu operacyjnego będzie zarządzać współużytkowaniem zasobów o wiele lepiej i powinien pozwolić na uruchamianie wątków web2py, ponieważ systemy operacyjne faktycznie zapewniają preferencyjne traktowanie wątków związanych z IO. W takich przypadkach dostępna jest biblioteka multiprocessing. Będzie wymagało trochę więcej kodu, aby to działało, ale powinno to pomóc.
Multiprocessing wygląda jak możliwa opcja, dzięki @ William - – Chris
Którą wersję Python używasz? W wersji 3.2, the GIL was changed to yield after fixed timeslices rather than after a certain number of high-level opcodes.
Nawet przy tej zmianie, intensywny procesor może wpłynąć na opóźnienie twojej aplikacji internetowej (i odwrotnie, część wrażliwa na IO zapobiegnie zajęciu przez część procesora całego rdzenia). Powinieneś po prostu odpracować zadania do procesów roboczych za pomocą kolejki podobnej do beanstalkd i pozwolić programistce systemu operacyjnego zrobić to samo.
Myślę, że nowy GIL jest tylko w 3.2. W rzeczywistości pracują nad ulepszeniem go w wersji 3.3 http://bugs.python.org/issue7946 Niestety obsługa Pythona 3 w frameworkach internetowych dopiero zaczyna być rozwijana. Jeszcze nie słyszałem o stabilnym. – William
@William dzięki, poprawione. [Intensywne dusze znajdą tutaj backport.] (Http://bugs.python.org/issue7753) – Tobu
Jest mało prawdopodobne, że intensywność procesora powoduje, że wątek blokuje. Znacznie bardziej prawdopodobne jest, że masz problemy z Globalną Blokadą Interpretera (http://wiki.python.org/moin/GlobalInterpreterLock). Musisz podać trochę więcej informacji, abyśmy mogli ocenić sytuację. Co dokładnie robią twoje wątki? – Wilduck
@Wilduck Intensywny wątek procesora może dodać opóźnienie IO (choć mniej w ostatnim Pythonie), patrz ilustracja: http://dabeaz.blogspot.com/2010/01/python-gil-visualized.html – Tobu
@Wilduck wątek faktycznie wywołuje kod w JS. Mam ochotę wypróbować GIL (jeśli jeszcze nie jest), ale to zmusiłoby mnie do upewnienia się, że JS w ogóle nie potrzebuje GIL ... Prawdopodobnie zostanę na chwilę i znaleźć obejście. – Chris