# gevent/greenlet.py
class Greenlet(greenlet):
def __init__(self, run=None, *args, **kwargs):
_greenlet__init__(self, None, get_hub()) # 指定 hup 为 parent
self._run = run # Greenlet.switch 切换会调用 run 函数
@classmethod
def spawn(cls, *args, **kwargs):
g = cls(*args, **kwargs)
g.start()
return g
def start(self):
if self._start_event is None:
self._start_event = self.parent.loop.run_callback(self.switch) # 注册 swtich 到 loop
def run(self):
self._run(*self.args, **self.kwargs)
# gevent/hup.py
class Hub(WaitOperationsGreenlet):
def run(self): # Hup.switch 切换会调用 run 函数
while 1:
try:
self.loop.run() # 事件循环 run
finally:
loop.error_handler = None # break the refcount cycle
import gevent
def test1():
print('进入 test1')
gevent.sleep(0)
print('切换 test1')
def test2():
print('进入 test2')
gevent.sleep(0)
print('切换 test2')
gevent.joinall([gevent.spawn(test1),
gevent.spawn(test2),
])
进入 test1
进入 test2
切换 test1
切换 test2