Python 如何在包含while循环的两个进程之间共享字符串?

Python 如何在包含while循环的两个进程之间共享字符串?,python,multiprocessing,Python,Multiprocessing,我一直在努力在两个进程之间传递变量 我有两个进程,一个循环运行pyqt5gui(进程a),另一个通过while循环实时运行视频流上的一些计算机视觉功能(进程B) 我想读取一个从B到a不断更新(每秒30次)的变量,延迟高达~200ms并不重要 进程A将根据进程B传递的var对GUI进行更改,但我很难将该变量传递给其他进程 我附上了一些框架代码,显示了我当前的失败尝试,我已经多次重读了文档,并在这里提出了大量问题,但我对多重处理还不熟悉,所以我有点困惑,如果有人能看一下并为我指出正确的方向,我将不胜

我一直在努力在两个进程之间传递变量

我有两个进程,一个循环运行pyqt5gui(进程a),另一个通过while循环实时运行视频流上的一些计算机视觉功能(进程B)

我想读取一个从B到a不断更新(每秒30次)的变量,延迟高达~200ms并不重要

进程A将根据进程B传递的var对GUI进行更改,但我很难将该变量传递给其他进程

我附上了一些框架代码,显示了我当前的失败尝试,我已经多次重读了文档,并在这里提出了大量问题,但我对多重处理还不熟悉,所以我有点困惑,如果有人能看一下并为我指出正确的方向,我将不胜感激, 谢谢


你的程序有什么问题?至少从参数传递的角度来看,它似乎工作得很好。我对您的代码进行了一些调整(添加了一个随机选择,并在主进程中添加了睡眠,以避免它立即退出),它似乎做得很好:

import multiprocessing
from multiprocessing import Process, Manager
from ctypes import c_wchar_p  # c_wchar_p
from time import sleep
import random

def processA(sharedMessageA):
    while True:                               # set up and render GUI
        sleep(0.01)
        if sharedMessageA.value == "Left":     # Read shared variable from ProcessB and do things
            print("Lbutton")
        elif sharedMessageA.value == "Right":
            print("Rbutton")

def processB(sharedMessageB):
    while True:
        sleep(0.05)                    # get video stream and performs various computer vision functions
        sharedMessageB.value = random.choice(["Left", "Right"])   # write result of functions to variable for process A to use

def startMultiProcessing():
    p1 = Process(target=processA, args=(sharedMessage,))
    p2 = Process(target=processB, args=(sharedMessage,))
    p1.start()
    p2.start()

def main():
    startMultiProcessing()
    sleep(30)

if __name__ == '__main__':
    manager = multiprocessing.Manager()
    sharedMessage = manager.Value(c_wchar_p, "Test") # initialise shared value
    main()
现在,当我运行此程序时,我会收到预期的随机“按钮”消息:

test@test:~$ python3 foo.py 
Lbutton
Lbutton
Lbutton
Lbutton
Lbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Lbutton
Lbutton
Lbutton
不管问题是什么,都不是在进程之间传递字符串。那部分你做得对


注意:当您传递一个简单的元素时,您可以通过切换到共享内存来提高性能,但这在您的情况下可能并不重要。

从哲学上讲,这不是一个好的计划。只有在进程相互独立的情况下,多处理才能真正发挥作用。为此,您可以使用一对
多处理.Queue
结构,也可以使用TCP套接字(这可能是Queue在封面下使用的)<代码>多处理.Queue和
Queue.Queue
都是非常方便的数据结构,它们没有得到应有的喜爱。感谢您的关注,是的,当我将其与实际程序进行比较时,您是对的,我调用的是变量的父名称,而不是该进程的本地名称,我的错,我想我做这件事已经太久了,尽管我已经准备好放弃:)
test@test:~$ python3 foo.py 
Lbutton
Lbutton
Lbutton
Lbutton
Lbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Rbutton
Lbutton
Lbutton
Lbutton