gevent动态随时添加任务

 保持和py的Threadpoolexecutor一样的submit 方法名,是程序更容易在两种模式之间切换。


class GeventPoolExecutor(LoggerMixin):
def __init__(self, max_works, ):
self._q = JoinableQueue(maxsize=max_works)
# self._q = Queue(maxsize=max_works)
for _ in range(max_works):
gevent.spawn(self.__worker)
atexit.register(self.__atexit)

def __worker(self):
while True:
fn,args,kwargs = self._q.get()
try:
fn(*args,**kwargs)
except Exception as exc:
self.logger.exception(f'函数 {fn.__name__} 中发生错误,错误原因是 {type(exc)} {exc} ')
finally:
pass
self._q.task_done()

def submit(self, fn:Callable,*args,**kwargs):
self._q.put((fn,args,kwargs))

def __atexit(self):
self.logger.critical('想即将退出程序。')
self._q.join()
 
原文地址:https://www.cnblogs.com/ydf0509/p/7210950.html