使用芹菜和Python将输入和图像处理作业发送到多台机器
最近,我一直在Ubuntu中使用Python3.x玩芹菜和花(用于在一台机器上显示仪表板和任务)。首先,我安装了rabbitmq服务器、radis、芹菜和鲜花。然后,我创建了一个名为使用芹菜和Python将输入和图像处理作业发送到多台机器,python,multithreading,opencv,celery,flower,Python,Multithreading,Opencv,Celery,Flower,最近,我一直在Ubuntu中使用Python3.x玩芹菜和花(用于在一台机器上显示仪表板和任务)。首先,我安装了rabbitmq服务器、radis、芹菜和鲜花。然后,我创建了一个名为tasks.py的脚本,其中包含以下内容: from celery import Celery # py-advanced-message-queuing-protocol app = Celery('tasks', backend='redis://localhost', broker='pyamqp://loc
tasks.py
的脚本,其中包含以下内容:
from celery import Celery
# py-advanced-message-queuing-protocol
app = Celery('tasks', backend='redis://localhost', broker='pyamqp://localhost//')
@app.task
def intensive_sum1(num):
val = sum(x**4 for x in range(num))
return val
@app.task
def intensive_sum2(num):
val = sum(x**4 for x in range(num))
return val
@app.task
def intensive_sum3(num):
val = sum(x**4 for x in range(num))
return val
然后我创建了一个脚本run.py
包含
from tasks import intensive_sum1, intensive_sum2, intensive_sum3
import time
start = time.time()
result1 = intensive_sum1.delay(100000000)
result2 = intensive_sum2.delay(100000000)
result3 = intensive_sum3.delay(100000000)
print(result1.get(), result2.get(), result3.get())
end = time.time()
print('time: ', end - start)
start = time.time()
result1 = sum(x**4 for x in range(100000000))
result2 = sum(x**4 for x in range(100000000))
result3 = sum(x**4 for x in range(100000000))
print(result1, result2, result3)
end = time.time()
print('time: ', end - start)
在运行后者之前,我启动了两个不同的终端,并将目录更改为两个脚本的位置。然后,我在一个终端中运行了sudo芹菜-tasks flower
,在另一个终端中运行了芹菜-tasks worker--loglevel=info
。事实证明,(惊喜)芹菜可以将每个任务分配到单个核心,从而节省大量时间。当然,这种节省时间的方法只适用于大型函数,因为较小的函数会产生线程生成开销,这不会带来任何好处
这让我想到了另一个问题。假设我有3台机器连接到同一个WIFI路由器,而不是一台机器。我可以使用
ifconfig
命令计算出这些Ubuntu机器的IP地址。假设其中一台机器是主机器,它包含一个main.py
脚本,该脚本使用Opencv Python捕获对象捕获实时图像。然后,它对每个图像进行拍摄、序列化,并将其作为消息发送给两台工作机器。两台工作机器都独立工作,并且都对同一映像进行反序列化。一台工作机器执行cat分类并返回cat概率,另一台机器执行dog分类并返回dog概率。一台工人机器可能比另一台工人机器需要更长的时间才能得出结论。但是,对于该特定帧,主机需要等待两个分类结果,然后再将一些结果叠加到该特定帧的顶部。本能地,我相信主机器在前进之前需要检查两个作业是否准备就绪(,例如result\u worker\u one.ready()==result\u worker\u two.ready()==True
)。我如何实现这种行为?如何在主计算机中序列化一个RGB图像并在工作计算机中反序列化它?每个机器需要什么后端
和代理
?如何将其设置为客户机-服务器体系结构?关于跨多台机器分发作业,您是正确的。事实上,这是芹菜的主要用途之一
@app.task
def check_dog():
#dog_classification code
@app.task
def check_cat():
#cat classification code
您可以将这些任务组合在一起,然后使用一个和弦(和弦是一个仅在组中的所有任务都完成执行后才执行的任务)在执行完这两个函数后转到下一步。在如下所示的回调函数中包含两个任务之后需要执行的任何操作。
相关文档可在此处找到:
app = Celery('tasks', backend='redis://localhost', broker='pyamqp://<username>:<password>@<ip of task queue host>')
app=芹菜('tasks',后端='redis://localhost,broker='pyamqp://:@')
确保为每个芹菜工作者提供一个任务文件,因为传递给工作者的消息不包含源代码,只包含任务名称本身app = Celery('tasks', backend='redis://localhost', broker='pyamqp://<username>:<password>@<ip of task queue host>')