Python Reddis队列ValueError:工作人员无法处理__main__模块中的函数

use*_*973 11 redis python-rq

我正在尝试使用python-rq将redis中的基本作业排入队列,但它会抛出此错误

"ValueError:工作人员无法处理模块的功能"

这是我的计划:

import requests

def count_words_at_url(url):
    resp = requests.get(url)
    return len(resp.text.split())

from rq import Connection, Queue
from redis import Redis
redis_conn = Redis()
q = Queue(connection=redis_conn)
job = q.enqueue(count_words_at_url, 'http://nvie.com')
print job
Run Code Online (Sandbox Code Playgroud)

GG_*_*hon 17

将提供的代码分解为两个文件: count_words.py:

import requests

def count_words_at_url(url):
    resp = requests.get(url)
    return len(resp.text.split())
Run Code Online (Sandbox Code Playgroud)

main.py(你将导入所需的函数):

from rq import Connection, Queue
from redis import Redis
from count_words import count_words_at_url # added import!
redis_conn = Redis()
q = Queue(connection=redis_conn)
job = q.enqueue(count_words_at_url, 'http://nvie.com')
print job
Run Code Online (Sandbox Code Playgroud)

我总是将任务从运行这些任务的逻辑分离到不同的文件.这只是更好的组织.另请注意,您可以定义一类任务并从该类导入/计划任务,而不是上面建议的(过度简化)结构.这应该让你去..也请看这里确认你不是第一个与这个例子斗争的人.一旦掌握了RQ,RQ就很棒了.

  • 有没有办法解决?我发现它使我的项目变得支离破碎,例如,当我希望一项任务创建多个其他任务并提交它们时。现在,我的两个任务虽然在逻辑上相关,但必须分成多个文件,以便一个可以导入另一个。我注意到 rq 的 Job 类中的代码检查 string_types 的实例,因此不清楚为什么不能使用 'this_filename.some_other_func' 提交,但它不起作用。 (2认同)

小智 7

目前RQ中有一个bug,导致了这个错误。如果不显式导入它,您将无法从同一文件传递队列中的函数。

add from app import count_words_at_url在入队函数之上:

import requests

def count_words_at_url(url):
    resp = requests.get(url)
    return len(resp.text.split())

from rq import Connection, Queue
from redis import Redis
redis_conn = Redis()
q = Queue(connection=redis_conn)

from app import count_words_at_url
job = q.enqueue(count_words_at_url, 'http://nvie.com')
print job
Run Code Online (Sandbox Code Playgroud)

另一种方法是将函数放在单独的文件中并导入它们。