In a gevent application, how can I kill all greenlets that have been started?

StackOverflow https://stackoverflow.com/questions/19780869

  •  03-07-2022
  •  | 
  •  

문제

I have a gevent application that spawns multiple greenlets across multiple modules. I want to be able to gracefully shutdown the application (either internally or by catching SIGTERM, for instance), allowing greenlets to terminate nicely by catching GreenletExit and executing finally: clauses.

If I had the a of all running greenlets, I could do gevent.killall(list_of_greenlets), but maintaining such a list is rather a hassle; besides, gevent must be keeping this very list in some form or another.

So, can I kill all greenlets that have been started without maintaining a list of them?

(I'm using gevent 1.0.0 on python 2.7 on raspbian)

도움이 되었습니까?

해결책

According to another SO answer, it's possible "to iterate through all the objects on the heap and search for greenlets." So, I imagine this ought to work:

import gc
import gevent
from greenlet import greenlet    
gevent.killall([obj for obj in gc.get_objects() if isinstance(obj, greenlet)])

다른 팁

This didn't quite work for the versions of gevent (1.2.2) and greenlet (0.4.13) I was using but the following does:

import gc
import gevent
gevent.killall(
    [obj for obj in gc.get_objects() if isinstance(obj, gevent.Greenlet)]
)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top