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

时间:2015-10-07 16:31:42

标签: python multithreading tcp multiprocessing

我们正在为Python创建一些硬件的制造测试。我们有一个UI,用户将使用它来运行通过TCP Socket以Python编写的测试脚本。

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

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

我的问题是:我可以在测试脚本中使用全局变量,该变量将由TCP循环过程设置,硬件循环过程可以检查并在设置全局变量时停止吗?

编辑:我们使用c#来编写UI,管理决定是将Python用于测试脚本,而不是将它们与UI捆绑到c#中。是否通过TCP连接使用Python与c#是最好的方法是在我的paygrade之外。

1 个答案:

答案 0 :(得分:0)

全局变量不会在进程间共享,但会被复制。这意味着他们都有自己的副本。如果第一个改变了它的价值,那么第二个赢了。

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

multiprocessing Queue是你想要使用的:

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

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