Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.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_Tcp_Multiprocessing - Fatal编程技术网

在python中设置变量时,如何使一个多处理循环停止另一个多处理循环?

在python中设置变量时,如何使一个多处理循环停止另一个多处理循环?,python,multithreading,tcp,multiprocessing,Python,Multithreading,Tcp,Multiprocessing,我们正在用Python为一些硬件创建一个制造测试。我们有一个用户界面,用户将使用它通过TCP套接字运行用Python编写的测试脚本 现在我正在尝试编写一个测试,该测试同时运行一个循环,向硬件发送命令,并运行一个循环,通过TCP连接侦听来自UI的交互(即用户单击“是”按钮)。一旦从TCP连接接收到消息,将设置一些变量,然后这些变量将从向硬件发送命令的其他循环中断 现在,我们正在考虑使用多处理而不是多线程,因为只有两个简单的循环,所以不会有太多的开销。因此,每个循环将在不同的进程中运行 我的问题是:

我们正在用Python为一些硬件创建一个制造测试。我们有一个用户界面,用户将使用它通过TCP套接字运行用Python编写的测试脚本

现在我正在尝试编写一个测试,该测试同时运行一个循环,向硬件发送命令,并运行一个循环,通过TCP连接侦听来自UI的交互(即用户单击“是”按钮)。一旦从TCP连接接收到消息,将设置一些变量,然后这些变量将从向硬件发送命令的其他循环中断

现在,我们正在考虑使用多处理而不是多线程,因为只有两个简单的循环,所以不会有太多的开销。因此,每个循环将在不同的进程中运行

我的问题是:我是否可以在测试脚本中使用一个全局变量,该变量将由TCP循环进程设置,硬件循环进程可以根据该变量进行检查,并在设置全局变量时停止


编辑:我们使用c#编写UI,管理层决定使用Python编写测试脚本,而不是将它们与UI集中在c#中。通过TCP连接使用Python与c#是否是一种最佳的方法不在我的paygrade范围内。

全局变量不会在进程之间共享,而是会被复制。这意味着他们都有自己的副本。如果第一个更改其值,则第二个不会更改

Python允许并发/并行循环相互通信的最简单方法是使用消息传递队列

以下是您想要使用的:

from queue import Empty
from multiprocessing import Process, Queue

def process1(queue):
    while 1:
        try:
            message = queue.get(block=False)
            if message == "you must stop my dear":
                return
        except Empty:
            do_your_job()


def process2(queue):
    do_something()
    queue.put("you must stop my dear")


q = Queue()
p1 = Process(target=process1, args=(q, ))
p2 = Process(target=process2, args=(q, ))
p1.start()
p2.start()

这是一个非常简单的示例,我希望它给出了一个想法。

全局变量不会在进程之间共享,而是会被复制。这意味着他们都有自己的副本。如果第一个更改其值,则第二个不会更改

Python允许并发/并行循环相互通信的最简单方法是使用消息传递队列

以下是您想要使用的:

from queue import Empty
from multiprocessing import Process, Queue

def process1(queue):
    while 1:
        try:
            message = queue.get(block=False)
            if message == "you must stop my dear":
                return
        except Empty:
            do_your_job()


def process2(queue):
    do_something()
    queue.put("you must stop my dear")


q = Queue()
p1 = Process(target=process1, args=(q, ))
p2 = Process(target=process2, args=(q, ))
p1.start()
p2.start()

这是一个非常简单的例子,我希望它能给出一个想法。

在做了一些研究之后,我决定实现一个多处理管道。然而,pipe方法有点复杂,需要一个输入和输出管道,队列似乎是一种更简单的方法,并且可能更具可读性。我可能只是为队列重写代码,这样代码更易于维护。谢谢队列构建在管道之上,以简化其接口。管道在成本方面更有效,但对于大多数用例,我强烈建议使用队列。在做了一些研究之后,我决定实现一个多处理管道。然而,pipe方法有点复杂,需要一个输入和输出管道,队列似乎是一种更简单的方法,并且可能更具可读性。我可能只是为队列重写代码,这样代码更易于维护。谢谢队列构建在管道之上,以简化其接口。管道在成本方面更有效,但对于大多数用例,我强烈建议使用队列。