Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用芹菜和Python将输入和图像处理作业发送到多台机器_Python_Multithreading_Opencv_Celery_Flower - Fatal编程技术网

使用芹菜和Python将输入和图像处理作业发送到多台机器

使用芹菜和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

最近,我一直在Ubuntu中使用Python3.x玩芹菜和花(用于在一台机器上显示仪表板和任务)。首先,我安装了rabbitmq服务器、radis、芹菜和鲜花。然后,我创建了一个名为
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
    
    您可以将这些任务组合在一起,然后使用一个和弦(和弦是一个仅在组中的所有任务都完成执行后才执行的任务)在执行完这两个函数后转到下一步。在如下所示的回调函数中包含两个任务之后需要执行的任何操作。 相关文档可在此处找到:

  • 请看一下图像序列化部分:

  • 为了回答问题的第三部分,芹菜固有地遵循客户机-服务器体系结构来支持并行计算。无论何时调用芹菜任务,它都会在您设置的消息代理上放置一条消息(在您的示例中,您使用了rabbitMQ)。此消息将包含有关要运行的任务的信息以及所有必需的参数。消息队列将跨不同的机器向芹菜工人传递消息。工作人员收到消息后,将执行消息中描述的任务。因此,如果你想在多台计算机之间分配任务,你所要做的就是在每台机器上启动一个芹菜工人,它在你的主机上监听你的消息队列。您可以按如下方式配置工人

    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>')