python eventlet - когда использовать tpool VS Greenpool
Насколько я понимаю, tpool предоставляет вам пул собственных потоков, тогда как Greenpool предлагает вам пул зеленых потоков (по сути, все зеленые потоки находятся в одном собственном потоке).
tpool
def my_func(start_ident): print "start_ident:%s" % start_ident print "running in new thread: %s %s" % (start_ident != thread.get_ident(), thread.get_ident()) tpool.execute(my_func, thread.get_ident()
результаты: разные нативные темы
start_ident:140735259603328 running in new thread: True 4616945664
Greenpool
def worker(line): print "worker in thread %s" % thread.get_ident() return line pool = GreenPool() for result in pool.imap(worker, open("test.txt", 'r')): print result
результаты: зеленые потоки работают в той же самой нити
worker in thread 140735259603328 worker in thread 140735259603328 worker in thread 140735259603328 worker in thread 140735259603328 .......
Может ли кто-нибудь указать мне, когда использовать один бассейн против другого.
1 ответ
В идеальном мире [3] вам потребуется только GreenPool
, Но когда вы вызываете некоторый неизбежно блокирующий код:
open
файл [1]- Расширение C с большим количеством процессоров работает как
lxml
или жеnumpy
- Расширение C, которое использует блокирующие сокеты, такие как
mysqldb
и время, которое он блокирует, становится проблемой [2], тогда вы можете попробовать tpool, чтобы разгрузить эти блокирующие задачи в отдельный поток. CPython имеет большие затраты на это, так что это не всегда поможет, снова измерьте [2] все. Например open('/dev/null', 'rb')
будет дешевле в большинстве случаев; в то время как open('/mnt/nfs/file', 'rb')
может потребоваться некоторое время для подключения удаленного сервера.
[1] есть как асинхронные, так и неблокирующие опции для работы с файлами. К сожалению, для Linux я не знаю ни одного решения, кроме tpool
как это действительно будет работать в качестве замены для замены open
,
[2], что вы бы знали только по приборам, измерениям и просмотру метрик. В этой области есть множество как ужасного, так и отличного программного обеспечения, и вам нужно хотя бы что-то узнать, чтобы узнать точные цифры. "Это кажется медленным" - это не информация. "Среднее время отклика уменьшилось на 20% после последнего выпуска" гораздо полезнее.
[3] примеры совершенного мира: Erlang, Go, Haskell