遵循本教程https://github.com/Bogdanp/dramatiq我创建了一个简单的python脚本来检查它是否有效。我做了一些简单的操作如下
它确实运行良好。
请注意,有两个终端,一个用于运行脚本,一个用于worker。在下面给出的脚本中,count_word函数中的print语句在第二个终端中执行
working example
import pandas as pd
import dramatiq
import requests
import sys
@dramatiq.actor
def count_words(url):
response = requests.get(url)
count = len(response.text.split(" "))
data = {'Name': ['Tom', 'nick', 'krish', 'jack'],
'Age': [20, 21, 19, 18]}
df = pd.DataFrame(data)
df.to_csv(r'C:Users91956Desktopasdf.csv')
print(df)
print(f"There are {count} words at {url!r}.")
if __name__ == "__main__":
count_words.send("http://whatsapp.com")
所以我继续尝试在我的flask应用程序中做同样的事情,我希望process_data中的打印语句会在工人终端中打印出来,但它根本没有打印出来,仅";嗨,我在上班";在我运行烧瓶应用的终端中打印
@app.route('/work')
def work():
print("hi i am in work")
@dramatiq.actor
def process_data():
print('hi i am in process_data')
process_data.send()
return "hello"
我想在后台运行process_ data函数,我是一个初学者,知道的不多,有可能以我现在的方式实现吗?
所以我想知道如何在烧瓶的后台运行特定的函数?
当process_data.send()
执行时,它会将消息排入您的broker中,然后返回以继续执行您的函数。由于您的函数会立即返回一个响应体,因此该HTTP请求会立即完成——可能在process_data
开始或完成执行之前。
对此你能做些什么?首先,接受异步或并发处理就是这样。然后,了解检索延迟或异步进程结果的各种策略。
-
轮询:通过发出查询结果的HTTP请求,定期轮询服务器,直到结果可用并可检索
-
在客户端和服务器之间建立一个websocket,用于接收请求和发送结果。这可能是最简单的解决方案,不需要客户端轮询服务器,尽管初始编码并不重要,但也有好的例子。例如,请参阅Quart项目,这是一个实现更好的websocket服务器解决方案的Flask fork:https://quart.palletsprojects.com/en/latest/
-
使用服务器";"推";机制,其中
process_data
尝试在完成时发送结果,可能通过客户端综合查询,该查询返回任何进程完成结果的短通知,或者返回结果本身 -
使用一个自动将服务器过程结果传递给客户端的框架(例如RPC框架可以做到这一点,也许React Redux可以做到?(
-
实现观察者模式的框架,其中在服务器上的进程完成后调用客户端回调函数。Spring Boot将其作为客户端-服务器观察者模式浏览器提供,但不确定Python有什么可用的。
我会实现选项#1或#2,因为它们是最简单的。您可以在Pypi周围查找许多RPC框架,这些框架确实可以作为回调进行往返调用,但我还没有找到一个可以为浏览器客户端进行往返调用的框架。我已经构建了这样一个客户端-服务器RPC框架,它在基于Quart的websocket应用服务器和EcmaScript浏览器客户端之间的websocket上运行。总有一天我会发布它。