我正在尝试在当前系统中实现一个redis队列。job将被发送到另一个模块,它应该等待工作完成并返回结果job.result,然后继续:
with Connection(redis_connection):
job = job_queue.enqueue(worker_func, func_input1, func_input2)
print("waiting for result")
print(datetime.datetime.now())
while job.result is None:
pass
print(datetime.datetime.now())
print("got result")
# next step
next_step_func(job.result)
...我在这里面临两个问题:
while job.result is None花了很长时间。我在worker_func中的处理时间约为2-3秒,这涉及到在另一台服务器上调用API,而繁忙的等待while job.result is None本身则需要另一个>= 3秒,使>=总共增加5秒。我确信等待发生在while job.result is None执行之后,因为我为worker_func和while job.result is None添加了日志: 2021-07-12T18:57:59.09+0800 [APP/PROC/WEB/0] OUT start work
2021-07-12T18:57:59.09+0800 [APP/PROC/WEB/0] OUT 2021-07-12 10:57:57.601189
2021-07-12T18:57:59.09+0800 [APP/PROC/WEB/0] OUT 2021-07-12 10:57:59.075137
2021-07-12T18:57:59.09+0800 [APP/PROC/WEB/0] OUT end work
...
2021-07-12T18:57:59.09+0800 [APP/PROC/WEB/0] OUT waiting for result
2021-07-12T18:57:59.09+0800 [APP/PROC/WEB/0] OUT 2021-07-12 10:57:53.704891
2021-07-12T18:57:59.09+0800 [APP/PROC/WEB/0] OUT 2021-07-12 10:57:59.096009正如您在上面看到的,繁忙的等待同时循环发生在worker_func完成之后。
2,是否有其他优雅的方法来实现这个同步等待而不是繁忙的循环?我认为这里的繁忙循环绝对不是最好的实现,因为它将消耗大量的CPU资源。
谢谢!
--编辑我上面的代码,给出一个更清晰的上下文
我需要从调用next_step_func(job.result)的地方返回job_queue.enqueue的值。因此,更明确的结构是:
def endpoint():
with Connection(redis_connection):
job = job_queue.enqueue(worker_func, func_input1, func_input2)
print("waiting for result")
print(datetime.datetime.now())
while job.result is None:
pass
print(datetime.datetime.now())
print("got result")
# next step
return next_step_func(job.result)
...因此,痛苦的一点是,我需要能够在job.result中返回的endpoint(),然而作业回调将把我的工作带到on_success的不同上下文中。
发布于 2021-07-12 11:35:59
文档建议使用作业回调作为选项:
def job_succeeded(job, connection, result, *args, **kwargs):
next_step_func(job.result)
def job_failed(job, connection, type, value, traceback):
# react to the error
pass
with Connection(redis_connection):
args = (func_input1, func_input2)
job_queue.enqueue(worker_func, args=args, on_success=job_succeeded, on_failure=job_failed)https://stackoverflow.com/questions/68346342
复制相似问题