gevent

1138 ワード

# 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