我有这样的情况:

主进程生成一些子进程,它们应该将结果写入字符串和数字类型的共享对象中,对于数字类型来说没有问题,但是字符串会丢失该值。

import multiprocessing as mp
from ctypes import Structure, c_double, c_wchar_p, c_int

# shared obj class
class SharedObj(Structure):
    _fields_ = [('name', c_wchar_p), ('val', c_double) ]

def run_mp( values , lock , s ) :
    for i in range( s , len( values ) , 2 ):
        lock.acquire()
        values[i].name = str( i ) # write the string value in the shared obj
        values[i].val = float( i )
        print( "tmp: %d" % i )
        lock.release()

def main():
    # creating the shared obj and mutex
    values = mp.Array(  SharedObj , [SharedObj() for i in range( 10 )] )
    lock_j = mp.Lock()

    # creating two sub-process form the function run_mp
    p1 = mp.Process( target=run_mp , args=( values , lock_j , 0 ))
    p2 = mp.Process( target=run_mp , args=( values , lock_j , 1 ))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    for v in  values:
        print()
        print( "res name: %s" % v.name )
        print( "res val: %f " % v.val )


if __name__ == '__main__':
    main()

结果,包含c_double的共享库中的字段被写入该字段,但是在子进程rum-mp(string values[i].name = str( i ))中生成的字符串将在主进程中丢失。

有没有一种方法可以保存在子过程中生成的字符串?

此代码的输出如下所示:

其中主进程中生成的字符串是完全随机的。
tmp: 0
tmp: 2
tmp: 3
tmp: 4

res name: ����羍����羍
res val: 0.000000
res name: ����羍����羍
res val: 1.000000
res name:
res val: 2.000000   ....

最佳答案

这是您的代码的稍作修改的版本:

#!/usr/bin/env python

将多处理导入为mp

def run_mp(values):
对于c_arr,c_double的值:
c_arr.value ='hello foo'
c_double.value = 3.14

def main():
锁= mp.Lock()
child_feed = []
对于我在范围(10)中:
child_feed.append((
mp.Array('c',15,lock = lock),
mp.Value('d',1.0/3.0,lock = lock)
))

p1 = mp.Process(target = run_mp,args = {child_feed,))
p2 = mp.Process(target = run_mp,args = {child_feed,))

p1.start()
p2.start()

p1.join()
p2.join()

对于c_arr,在child_feed中为c_double:
打印()
print(“res name:%s”%c_arr.value)
print(“res val:%f”%c_double.value)

如果__name__ =='__main__':
主要的()

看看http://docs.python.org/library/multiprocessing.html。有一个使用字符数组的示例。

还有一个mmap模块允许共享内存http://docs.python.org/library/mmap.html,但与此同时,您可能必须通过信号量来同步自己的访问。如果您喜欢更简单的方法,请使用管道。

关于python - 在子进程的共享c_char_p中设置字符串的值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12342917/

10-12 20:56