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