我有这样的情况:
主进程生成一些子进程,他们应该将结果写入字符串和数字类型的共享对象中,对于数字类型没有问题,但是对于字符串,值会丢失。
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 ....