21

我正在尝试使用 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
4

2 回答 2

27

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

import requests

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

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

我总是将任务与运行这些任务的逻辑分开到不同的文件中。这只是更好的组织。另请注意,您可以定义一类任务并从该类导入/计划任务,而不是我上面建议的(过度简化的)结构。这应该可以让您继续前进.. 另请参阅此处以确认您不是第一个遇到此示例的人。一旦你掌握了它,RQ 就很棒。

于 2015-06-24T16:43:54.850 回答
3

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

add from app import count_words_at_url在 enqueue 函数之上:

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

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

于 2021-04-25T20:03:10.240 回答