Можно ли использовать 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 ответ:
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 форме).