Python 在子进程中访问字符串值时冻结

Python freezes when accessing string value in subprocess

我花了将近一整天的时间来完成我的知识:

我想更改子进程中的共享 multiprocessing.Value 字符串,但是 python 在子进程尝试更改共享值时立即挂起。

下面是一个示例代码:

from multiprocessing import Process, Value, freeze_support
from ctypes import c_wchar_p

def test(x):
    with x.get_lock():
        x.value = 'THE TEST WORKED'
    return 

if __name__ == "__main__":      
    freeze_support()
    value = Value(c_wchar_p, '')
    p = Process(target=test, args = (value,))
    p.start()
    print(p.pid)
    # this try block is to also allow p.run() 
    try:
            p.join()
            p.terminate()
    except:
            pass
    print(value.value)

我试过但不起作用的方法:

什么有效(但没有帮助):

我正在使用 Windows 10 64 位和 Python 3.6.4(Spyder,但也在 Spyder 之外尝试过)。

欢迎任何帮助!

共享指针在另一个进程中不起作用,因为该指针仅在创建它的进程中有效。相反,使用数组:

import multiprocessing as mp

def test(x):
    x.value = b'Test worked!'

if __name__ == "__main__":      
    x = mp.Array('c',15)
    p = mp.Process(target=test, args = (x,))
    p.start()
    p.join()
    print(x.value)

输出:

b'Test worked!'

请注意,数组类型 'c' 是专用的,return 是 SynchronizedString 与 return SynchronizedArray 的其他类型相比。以下是如何使用类型 'u' 例如:

import multiprocessing as mp
from ctypes import *

def test(x):
    x.get_obj().value = 'Test worked!'

if __name__ == "__main__":      
    x = mp.Array('u',15)
    p = mp.Process(target=test, args = (x,))
    p.start()
    p.join()
    print(x.get_obj().value)

输出:

Test worked!

请注意,对包装值的非原子操作(例如 += 执行 read/modify/write 的操作应使用 with x.get_lock(): 上下文管理器进行保护。