Можно ли использовать Gevent в сочетании с реальными потоками в CPython?


Просто интересно, может ли gevent coro-thread работать с реальной резьбой? может быть, я могу написать программу с несколькими потоками, и в каждом потоке есть некоторые сопрограммы?

Отредактировано

Как gevent.Threading, так и CPython threading имеют свою обратную сторону. сопрограммы не могут использовать несколько процессоров, в то время как производительность CPython Threading ограничена GIL, когда количество потоков велико. Я также работаю над чистой реализацией Python coroutine, подобной bluelet (хотя накладные расходы могут быть больше, чем gevent), чтобы добавить возможность использовать coro и резьбу одновременно.

И мне просто интересно, гевент или гринлет (https://pypi.python.org/pypi/greenlet ) может достичь способности coop с помощью CPython threading.

1 2

1 ответ:

Gevent 1.0 должен поддерживать наличие основного цикла Gevent на поток, если вы это имеете в виду.

Кроме того, gevent.threadpool позволяет запускать задачи в реальных потоках совместимым с gevent способом:

threadpool = gevent.threadpool.ThreadPool()
result = threadpool.spawn(some_non_gevent_friendly_thing_such_as_file_io)

result.get()  # or use ThreadPool.apply/apply_e to get the result value immediately

Вы найдете дополнительную информацию о gevent.threadpool, посмотрев на https://github.com/gevent/gevent/blob/master/gevent/threadpool.py (или doc, как только doc для 1.0 становится доступным в опубликованной / HTML форме).