如何使用 Redis Queue 将带有参数的函数排入队列?

Posted

技术标签:

【中文标题】如何使用 Redis Queue 将带有参数的函数排入队列?【英文标题】:How to enqueue a function with an argument with Redis Queue? 【发布时间】:2021-05-24 09:09:52 【问题描述】:

我想将一个函数排入队列以在后台运行(使用 Redis 队列)并在函数完成后向客户端发送消息,所以我在后台任务完成后使用 send(msg) 使用 Flask SocketIO。代码在这里

# Server

@app.route("/update")
def update():
  job = q.enqueue(updateFiles) # Send function to background
  return render_template("index.html")

@socketio.on("message")
def updateFiles(msg): # Function running on background
  time.sleep(5)
  send(msg) # Sending message to the client after executing functions updateFiles

# HTML (jQuery):

socket.emit("message", "Files updated successfully"); // Emitting message to server
socket.on('message', function (msg)  // Receive message from server and show it on HTML template
  $("#message").html(msg);
);

在服务器(Heroku)上有这个错误:

2021-02-22T05:12:00.810166+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/rq/job.py", line 719, in _execute
2021-02-22T05:12:00.810172+00:00 app[worker.1]:     return self.func(*self.args, **self.kwargs)
2021-02-22T05:12:00.810172+00:00 app[worker.1]: TypeError: actualizarExpedientes() missing 1 required positional argument: 'msg'

我发现问题出在job = q.enqueue(updateFiles),因为 updateFiles 需要一个参数。问题是参数msg 来自SocketIO,在使用jQuery 自动发出消息之后。如何解决这个问题?

【问题讨论】:

【参考方案1】:

来自rq docs

q = Queue('low', connection=redis_conn)
q.enqueue(count_words_at_url,
          ttl=30,  # This ttl will be used by RQ
          args=('http://nvie.com',),
          kwargs=
              'description': 'Function description', # This is passed on to count_words_at_url
              'ttl': 15  # This is passed on to count_words_at_url function
          )

当您调用 q.enqueue 时,只需将您的参数作为第二个参数放入

 job = q.enqueue(updateFiles, msg)

【讨论】:

以上是关于如何使用 Redis Queue 将带有参数的函数排入队列?的主要内容,如果未能解决你的问题,请参考以下文章

Django + Celery:如何将带有参数的任务链接到周期性任务

[Catel]如何将带有构造函数参数的 ViewModel 传递给 TabService 扩展方法?

函数参数太多的一种简化方法

如何将带有 args 的成员函数作为参数传递给另一个成员函数?

如何将字典传递给带有关键字参数的函数?

如何将函数添加到 api_addEventListener 到带有参数的 Vimeo 播放器