Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在芹菜工人退出之前,对键盘中断执行一些操作_Python_Python 3.x_Celery_Celerybeat - Fatal编程技术网

Python 在芹菜工人退出之前,对键盘中断执行一些操作

Python 在芹菜工人退出之前,对键盘中断执行一些操作,python,python-3.x,celery,celerybeat,Python,Python 3.x,Celery,Celerybeat,当遇到键盘中断(比如SIGINT)时,是否有办法在退出芹菜工人之前执行一些操作?我曾尝试在我的任务中使用信号模块,例如: signal.signal(signal.SIGINT, keyboard_interrupt_handler) 但它没有按我预期的方式工作。键盘中断处理程序确实会执行,但由于执行过程需要几秒钟,因此进程在完成执行之前就被终止 我还尝试使用signal.pthread\u sigmask临时阻止SIGINT信号,并在线程中运行处理程序(因为它们不能被杀死?),但它面临同样的

当遇到键盘中断(比如SIGINT)时,是否有办法在退出芹菜工人之前执行一些操作?我曾尝试在我的任务中使用信号模块,例如:

signal.signal(signal.SIGINT, keyboard_interrupt_handler)
但它没有按我预期的方式工作。
键盘中断处理程序
确实会执行,但由于执行过程需要几秒钟,因此进程在完成执行之前就被终止

我还尝试使用
signal.pthread\u sigmask
临时阻止
SIGINT
信号,并在线程中运行处理程序(因为它们不能被杀死?),但它面临同样的问题


有没有一种方法可以实现类似的功能?

我建议您尝试为该应用程序实现一个处理程序。一般来说,它们非常有用,芹菜用户应该熟悉它们,芹菜活动也是如此

示例代码:

app = Celery('my_tasks', include['my_tasks.tasks', 'their_tasks.tasks'])

@worker_shutdown.connect
def handle_worker_shutdown(**kwargs):
    mymodule.handle_worker_shutdown(app, _LOGGER, **kwargs)

我建议您尝试为该应用程序实现一个处理程序。一般来说,它们非常有用,芹菜用户应该熟悉它们,芹菜活动也是如此

示例代码:

app = Celery('my_tasks', include['my_tasks.tasks', 'their_tasks.tasks'])

@worker_shutdown.connect
def handle_worker_shutdown(**kwargs):
    mymodule.handle_worker_shutdown(app, _LOGGER, **kwargs)

谢谢当我在我的任务所在的文件中添加处理程序时,这看起来不错,而且似乎也很有效。但一旦我将它移动到一个单独的文件,它就停止执行。知道为什么吗?我必须在某个地方注册我的信号处理程序吗?我在回答中添加了示例代码-假设您在mymodule.handle\u worker\u shutdown()中实现了该处理程序,它应该在您创建芹菜实例的任何地方都能工作。。。这只是一个示例,复制/粘贴将不起作用-您需要编写自己的代码…我明白了。我从中了解到,调用处理程序在某种程度上是必要的,例如,我可以在创建芹菜应用程序的文件中编写这段代码?事实上,我做到了,而且成功了。在文件中单独编写处理程序是行不通的,对吗?另外,传递app参数是必要的,或者我可以只传递
**kwargs
?Worker将调用任何带有
@Worker\u shutdown注释(用Python术语修饰)的函数。connect
-我没有得到“独立处理程序”…我的意思是,我在一个django应用程序中创建了一个名为
Cellery\u signals.py
的文件,并将信号处理程序放在其中。但它并没有在关机时执行。当我将处理程序放在我的
tasks.py
文件中时,它成功了。谢谢。当我在我的任务所在的文件中添加处理程序时,这看起来不错,而且似乎也很有效。但一旦我将它移动到一个单独的文件,它就停止执行。知道为什么吗?我必须在某个地方注册我的信号处理程序吗?我在回答中添加了示例代码-假设您在mymodule.handle\u worker\u shutdown()中实现了该处理程序,它应该在您创建芹菜实例的任何地方都能工作。。。这只是一个示例,复制/粘贴将不起作用-您需要编写自己的代码…我明白了。我从中了解到,调用处理程序在某种程度上是必要的,例如,我可以在创建芹菜应用程序的文件中编写这段代码?事实上,我做到了,而且成功了。在文件中单独编写处理程序是行不通的,对吗?另外,传递app参数是必要的,或者我可以只传递
**kwargs
?Worker将调用任何带有
@Worker\u shutdown注释(用Python术语修饰)的函数。connect
-我没有得到“独立处理程序”…我的意思是,我在一个django应用程序中创建了一个名为
Cellery\u signals.py
的文件,并将信号处理程序放在其中。但它并没有在关机时执行。当我将处理程序放在我的
tasks.py
文件中时,它成功了。