蟒在子进程死机存取时字符串值

时间:2019-02-01 18:07:14

标签: python-3.x multiprocessing subprocess ctypes

我花了整整一整天的时间,结束了我的学识:

我想改变在子进程共享multiprocessing.Value字符串,但蟒挂起只要子过程试图改变共享值。

下面的示例代码:

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)

我尝试过但不起作用的内容:

  • 我尝试了c_wchar_pc_char_p类型的ctype,但是都导致相同的冻结。
  • 我试图也没有x.get_lock()
  • 我也尝试了没有freeze_support()

什么工作(但没有帮助):

  • 使用浮点数作为共享值(value = Value('d',0)x.value = 1)。
  • 在不启动子流程的情况下运行流程(将p.start()替换为p.run()

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

欢迎您的帮助!

1 个答案:

答案 0 :(得分:1)

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

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'是专业并返回一个SynchronizedString与其它类型的返回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!

请注意,应该使用+=上下文管理器来保护对包裹值的非原子操作(例如with x.get_lock():)进行读/修改/写操作。