我在Windows上运行Celery,我知道它在版本4中不受支持,但它在很大程度上仍然可以使用eventlet。
我试图在启动工作程序时运行这个init函数:
db = None
@worker_process_init.connect
def init_worker(**kwargs):
print('Initializing database connection for worker.')
global db
db = DB(dbname=os.getenv('DBNAME'))
我正在使用此命令运行工作程序:celery -A celeryapp.tasks worker -l info -P eventlet -c 8 -Q database
我不确定这是Windows的事情,eventlet的事情,还是其他的事情,但启动工作程序时,我的init函数没有运行。
worker_process_init
没有运行,因为没有;工人过程";启动。
如果你参考芹菜文档,它说worker_process_init
是";在所有池子进程中调度";。在此上下文中,子进程表示辅助进程。
当您使用eventlet、gevent或任何其他基于线程的池时,它们不会启动子进程。为了启动子进程,您需要使用多处理池,例如prefork(默认(。
如果您试图在工作进程启动时初始化数据库连接,则可能需要查看worker_init
。