Greenlets and Python Threads¶
Greenlets can be combined with Python threads; in this case, each thread contains an independent “main” greenlet with a tree of sub-greenlets. It is not possible to mix or switch between greenlets belonging to different threads.
>>> from greenlet import getcurrent
>>> from threading import Thread
>>> from threading import Event
>>> started = Event()
>>> switched = Event()
>>> class T(Thread):
... def run(self):
... self.glet = getcurrent()
... started.set()
... switched.wait()
>>> t = T()
>>> t.start()
>>> _ = started.wait()
>>> t.glet.switch()
Traceback (most recent call last):
...
greenlet.error: cannot switch to a different thread
>>> switched.set()
>>> t.join()
Note that when a thread dies, the thread’s main greenlet is not considered to be dead.
>>> t.glet.dead
False
Caution
For these reasons, it’s best to not pass references to a greenlet running in one thread to another thread. If you do, take caution to carefully manage the lifetime of the references.