我遇到这样的情况:
主进程生成一些子进程,它们应该将结果以字符串和数字类型写入共享对象中,对于数字类型没有问题,但是字符串的值将丢失。在
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}$
下面是您的代码稍作修改的版本:
看看http://docs.python.org/library/multiprocessing.html这里有一个使用字符数组的例子。在
还有一个mmap模块正试图共享内存http://docs.python.org/library/mmap.html,但有了这个模块,您可能需要通过信号量同步访问。如果你喜欢更简单的方法,只需使用管道。在
我不想使用
multiprocessing.Array
,因为显然需要提前指定它的大小。下面的方法适用于我拥有一个多处理兼容的unicode
对象。它用python2.6进行了多个进程的测试。在为了处理作者关于共享一个字符串和一个数字的具体问题,可以创建一个存储这些字符串和数字的可序列化对象并将其交给
Value
。在当然,您可能会反对为此使用
Manager
。如果是,请提供另一种解决方案。在相关问题 更多 >
编程相关推荐