python 进程间共享数据
2015-01-13 17:14
507 查看
def worker(num, mystr, arr): num.value *= 2 mystr.value = "ok" for i in range(len(arr)): arr[i] = arr[i] * (-1) + 1.5 def dump_vars(num, mystr, arr): print 'num: ', num.value print 'str: ', mystr[:] print 'arr: ', arr[:] if __name__=='__main__': num = Value('i', 5) mystr = Array('c', 'just for test') arr = Array('d', [1.0, 1.5, -2.0]) dir(str) print 'init value' dump_vars(num, mystr, arr) ps = [Process(target=worker, args=(num, mystr, arr)) for x in range(3)] for p in ps: p.start() for p in ps: p.join() print print 'after all workers finished' dump_vars(num, mystr, arr)
上述代码打印结果:
注意看红色框住的内容,多次测试我发现,在共享字符串的时候,在主进程中的初始化决定了这个字符串的长度,
创建后字符串的长度固定不变,相当于把这个字符串所在的地址复制给一个指针,并且在字符串的首地址记录了自身的长度,
在以后读取这个值的时候就会去读取那一段固定长度的内容,而不管现在的新内容长度是多少,举个例子:
比如我们在主进程初始化一段字符串 "abcde",一旦初始化,长度就固定了,现在长度是5,然后我们在其他进程赋值,我们尝试赋值为
"abcdefg",此时执行会报错,因为长度超标了,我们在赋值为 "yes",最后输出结果为 "yes&efg"(此处的&是代表一个不可显示的字符,不同的环境下显示不同,有可能显示空格,有可能显示null)。也就是说长短都不行,必须和初始化字符串等长。
于是得出这样一个结论,如果你要共享一个字符串,那么在子进程中赋值时必须赋值长度相当的字符串。建议在子进程中可以先检查字符串长度,然后在根据需要拼接指定长度的字符串
上面的分析建立在下面的基础上,请先看下面的基本用法:
多进程间共享数据,可以使用 multiprocessing.Value 和 multiprocessing.Array
Value(typecode_or_type, *args[, lock])
Value函数返回一个shared memory包装类,其中包含一个ctypes对象
typecode_or_type typecode列表如下
------------------------------------------------------------------
Type code C Type Python Type
'c' char character
'b' signed char int
'B' unsigned char int
'u' Py_UNICODE Unicode character
'h' signed short int
'H' unsigned short int
'i' signed int int
'I' unsigned int long
'l' signed long int
'L' unsigned long long
'f' float float
'd' double float
---------------------------------------------------------
Array(typecode_or_type, size_or_initializer, *, lock=True)
lock 默认值是True:创建一个新的lock来控制对value的访问。该参数也可以是 multiprocessing.Lock 或 multiprocessing.RLock 对像,用来控制对value的访问
相关文章推荐
- python 进程间共享数据 (二)
- python多进程中的队列数据共享问题
- Python 进程之间共享数据(全局变量)
- Python无关联进程共享数据
- python 进程间共享数据 (三)
- Python 进程之间共享数据(全局变量)
- Python多进程编程-进程间共享数据(Value、Array、Manager)
- python多进程入门、分布式进程数据共享
- python 进程间共享数据 (三)
- Python multiprocessing.Manager介绍和实例(进程间共享数据)
- python进程间共享数据
- Python的Socket知识8:进程、数据共享、进程池
- Python实现多进程共享数据的方法分析
- python 进程间共享数据 (二)
- 11.python并发入门(part10 多进程之间实现通信,以及进程之间的数据共享)
- 转发:Python通过Manager方式实现多个无关联进程共享数据
- python多进程并发中,解决数据共享问题Value+Array
- python基础-Manager进程数据共享、进程互斥锁数据非共享、线程互斥锁数据共享
- python 多进程数据交互及共享
- Python多进程数据共享之Array