Threads 和Greenlets 在交互环境中具有不同的行为。在某些情况下,主事件循环必须被破解。
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