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

Другие вопросы по тегам