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