LINUX.ORG.RU

Python: threads


0

0

Имеется веб-клиент, который создает кучу соединений. Для ускорения работы хотелось бы распараллелить обработку данных для каждого соединения.

Собсно, вопрос: как вызвать метод экземпляра класса в отдельном потоке?

★★★

я надеюсь вы про gil знаете, да? ну тогда вопрос сам собой отпадает наверное, либо вы хотите чего-нибудь странного

anonymous
()

Из-за наличия пресловутого GIL многопоточность в данном приложении имеет смысл лишь в случае если время собственно обработки данных существенно меньше времени IO операций для каждого соединения.

Kpoxman ★★
()

Если клиент работает с сокетами, то гила можно не сильно бояться.
Да и вообще он проблема больше надуманная.

import threading
threading.Thread(target=MyClass().method)

anonymous
()
Ответ на: комментарий от Kpoxman

А так - смотреть нужно в сторону stackless. Там эта проблема, вроде, решена. По крайней мере в EVE Online десятки тысяч пользователей на stackless-Питоне рулятся :)

KRoN73 ★★★★★
()

twisted deferreds?

Pi ★★★★★
()

Вот недавно была заметка про GIL:
Global Interpreter Lock: факты и мифы
http://murkt.org.ua/blog/2008/09/29/gil-facts-and-mythos/

Есть модуль multiprocessing, реализующий прозрачное использование процессов вместо потоков. Для python 2.5 этот модуль называется processing. При его использовании GIL исключается.

Есть ещё ParallelPython. Но он сложнее в использовании чем processing.

Можно ещё почитать про "микропотоки", реализованные на генераторах: http://www.ibm.com/developerworks/library/l-pythrd.html

Marvin
()
Ответ на: комментарий от Marvin

>"микропотоки"

это то что в народе называется green thread, и тут они точно будут не нужны

anonymous
()

Если код, который выполняется в потоке, написан на cи - то GIL тут не помешает.

Stackless опять-таки GIL'а не лишён, там микропоточность используется.

До меня тут по-моему перечислили все возможности по организации многопоточности.

Nekto0n
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.