Thread
s 和Greenlet
s 在交互环境中具有不同的行为。在某些情况下,主事件循环必须被破解。
Greenlet
来自gevent
模块,它是python中的并发任务。它有一个独立于 Python(pthread)的内部上下文切换,并且并发性非常好(根据我的经验)。Greenlets 的一些问题是,如果没有猴子补丁(模块中的模块gevent
),它们会阻塞阻塞 C 系统调用和套接字交互。
需要修补主事件循环才能使greenlet正常工作...如果您在交互式环境中生成greenlet,它将不会切换上下文并执行,我忘记了如何修补主事件循环(稍后会添加)。
失败示例:
In [1]: from gevent.greenlet import Greenlet
In [2]: def print_hi():
...: print 'hi'
...:
In [3]: print_hi()
hi
In [4]: g = Greenlet(print_hi)
In [5]: g.start()
编辑:
在查看了这个项目的一些代码之后,这里是我们如何破解 ipython 输入钩子以使用 gevent
import sys
import select
import gevent
def stdin_ready():
infds, outfds, erfds = select.select([sys.stdin], [], [], 0)
if infds:
return True
else:
return False
def inputhook_gevent():
try:
while not stdin_ready():
gevent.sleep(0.001)
except KeyboardInterrupt:
pass
return 0
# install the gevent inputhook
from IPython.lib.inputhook import inputhook_manager
inputhook_manager.set_inputhook(inputhook_gevent)
inputhook_manager._current_gui = 'gevent'
# First import the embeddable shell class
from IPython.frontend.terminal.embed import InteractiveShellEmbed
修补示例:
In [6]: def say_hi():
...: print "hi"
...:
In [7]: g = gevent.greenlet.Greenlet(say_hi)
In [8]: g.start()
In [9]: hi <-- Cursor is here so it printed hi