为第一个过程的返回值设定条件

Making conditions on returned value from first process

大家好,我正在制作一个简单的 python 程序,我需要一个多进程来同时启动两个函数。下面是程序的主要流程。

  1. 创建两个函数。
  2. 创建一个全局变量来存储函数的值。
  3. 使用 python 中的多处理库同时启动两个函数。
  4. 第一个函数的工作是在特定时间加载和更改全局变量的值。
  5. 第二个函数的工作是在全局变量不等于特定值时不断打印特定数据。

""" 导入时间 导入多处理

a = "Wait"
def test1():
    print("\n#######################\nFunction 1")
    global a
    time.sleep(1)
    a = "Loaded Data"
    print(a)

def test2():
    print("\n#######################\nFunction 2")
    global a
    print(a)

if __name__ == '__main__':
    t1 = multiprocessing.Process(target=test1, args=[])
    t1.start()
    time.sleep(2)
    t2 = multiprocessing.Process(target=test2, args=[])
    t2.start()

"""

以下代码的输出如下:

"""

#######################
Function 1
Loaded Data
#######################
Function 2
Wait

"""

我这里遇到的问题是第一个函数执行成功并打印了a的值。但是在第二个函数中它打印全局变量的旧值。

我觉得我做错了什么。我需要有人帮助我。 需要的是:

  1. 如何修复或更改全局变量值。

  2. 如何在第二个函数中对全局变量使用循环(条件)来打印值!=特定值。

  3. 请更正我的代码并说明如何在第二种情况下使用循环。如果 a!="LoadedData" 第二个函数连续打印“正在加载数据......请稍候”。否则停止循环。

也为我可怜又破烂的英语感到抱歉

在 Python 中,进程默认没有共享内存,尽管可以这样做。引用文档:

... when doing concurrent programming it is usually best to avoid using shared state as far as possible. This is particularly true when using multiple processes.

一种方法是使用 Manager and Value

from multiprocessing import Manager, Process
import time
import ctypes

def test1(a):
    print("\n#######################\nFunction 1")
    time.sleep(1)
    print(a.value)
    a.value = "Loaded Data"

def test2(a):
    print("\n#######################\nFunction 2")
    print(a.value)

if __name__ == '__main__':
    manager = Manager()
    a = manager.Value(ctypes.c_wchar_p, "Wait")

    t1 = Process(target=test1, args=(a,))
    t1.start()
    time.sleep(2)
    t2 = Process(target=test2, args=(a,))
    t2.start()
    t1.join()
    t2.join()

您获得全局 a 变量“旧”值的原因是每个进程都有自己的 a 副本。第二个进程是 Python 解释器的全新实例,对第一个进程一无所知。 我建议你先阅读docs