在子进程中设置共享c中的字符串值?

2024-10-01 13:39:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到这样的情况:

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

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沰u double的字段被写入字段中,但是在子进程rum mp(string values[i].name = str( i ))中生成的字符串将在主进程中丢失。在

有没有保存子进程中生成的字符串的方法?在

此代码的输出如下所示:

主进程中生成的字符串是完全随机的。在

^{pr2}$

Tags: therun字符串nameinlockobj进程
2条回答

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

#!/usr/bin/env python

import multiprocessing as mp


def run_mp( values ):
    for c_arr, c_double in values:
        c_arr.value = 'hello foo'
        c_double.value = 3.14

def main():
    lock = mp.Lock()
    child_feed = []
    for i in range(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()

    for c_arr, c_double in child_feed:
        print()
        print( "res name: %s" % c_arr.value )
        print( "res val: %f " % c_double.value )


if __name__ == '__main__':
    main()

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

还有一个mmap模块正试图共享内存http://docs.python.org/library/mmap.html,但有了这个模块,您可能需要通过信号量同步访问。如果你喜欢更简单的方法,只需使用管道。在

我不想使用multiprocessing.Array,因为显然需要提前指定它的大小。下面的方法适用于我拥有一个多处理兼容的unicode对象。它用python2.6进行了多个进程的测试。在

>>> shared_str = multiprocessing.Manager().Value(unicode, 'some initial value')
>>> shared_str.value
'some initial value'
>>> shared_str.value = 'some new value'
>>> shared_str.value
'some new value'

为了处理作者关于共享一个字符串和一个数字的具体问题,可以创建一个存储这些字符串和数字的可序列化对象并将其交给Value。在

当然,您可能会反对为此使用Manager。如果是,请提供另一种解决方案。在

相关问题 更多 >