Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有多处理功能的字符串共享内存数组_Python_Multiprocessing_Ctypes - Fatal编程技术网

Python 具有多处理功能的字符串共享内存数组

Python 具有多处理功能的字符串共享内存数组,python,multiprocessing,ctypes,Python,Multiprocessing,Ctypes,我正在尝试对一些现有代码进行多处理,我发现使用池对进程的数据进行酸洗/取消酸洗太慢。我认为在我的情况下,经理也会遇到同样的问题,因为它在幕后做同样的酸洗 为了解决这个问题,我尝试使用共享内存阵列。为了让它工作,我需要一个字符串数组。似乎multiprocessing.Array支持ctypes.c\u char\u p,但我很难将其扩展到字符串数组中。下面是我尝试过的许多事情中的一些 #!/usr/bin/python import ctypes import multiprocessing a

我正在尝试对一些现有代码进行多处理,我发现使用
对进程的数据进行酸洗/取消酸洗太慢。我认为在我的情况下,
经理
也会遇到同样的问题,因为它在幕后做同样的酸洗

为了解决这个问题,我尝试使用共享内存阵列。为了让它工作,我需要一个字符串数组。似乎
multiprocessing.Array
支持
ctypes.c\u char\u p
,但我很难将其扩展到字符串数组中。下面是我尝试过的许多事情中的一些

#!/usr/bin/python
import ctypes
import multiprocessing as mp
import multiprocessing.sharedctypes as mpsc
import numpy

# Tested possible solutions
ver = 1
if 1==ver:
    strings = mpsc.RawArray(ctypes.c_char_p, (' '*10, ' '*10, ' '*10, ' '*10))
elif 2==ver:
    tmp_strings = [mpsc.RawValue(ctypes.c_char_p, ' '*10) for i in xrange(4)]
    strings = mpsc.RawArray(ctypes.c_char_p, tmp_strings)
elif 3==ver:
    strings = []
    for i in xrange(4):
        strings.append( mpsc.RawValue(ctypes.c_char_p, 10) )

def worker(args):
    snum, lenarg = args
    string = '%s' % snum
    string *= lenarg
    strings[snum] = string
    return string

# Main progam
data = [(i, numpy.random.randint(1,10)) for i in xrange(3)]
print 'Testing version ', ver
print
print 'Single process'
for x in map(worker, data):
    print '%10s : %s' % (x, list(strings))
print

print 'Multi-process'
pool = mp.Pool(3)
for x in pool.map(worker, data):
    print '%10s : %s' % (x, list(strings))
    print '            ', [isinstance(s, str) for s in strings]
请注意,我使用的是
multiprocessing.sharedTypes
,因为我不需要锁定,它应该可以与
multiprocessing.Array相当互换

上述代码的问题在于,生成的
strings
对象包含常规字符串,而不是来自
mpsc.RawArray
构造函数的共享内存字符串。在版本1和版本2中,您可以看到在进程外工作时数据是如何被置乱的(如预期的)。对我来说,版本3一开始看起来很有效,但是你可以看到
=
只是将对象设置为一个常规字符串,虽然这对短测试有效,但在较大的程序中它会产生问题

似乎应该有一种方法来创建共享指针数组,其中指针指向共享内存空间中的字符串。如果您尝试使用
c\u str\u p
类型初始化它,而我还没有直接操作底层地址指针,那么
c\u void\u p
类型会发出抱怨


任何帮助都将不胜感激。

首先,您的第三个解决方案不起作用,因为
字符串
不是由多处理部分更改的,而是由单个处理部分修改的。您可以通过注释单个流程部件进行检查

第二,这一个将起作用:

import ctypes
import multiprocessing as mp
import multiprocessing.sharedctypes as mpsc
import numpy

strings = [mpsc.RawArray(ctypes.c_char, 10) for _ in xrange(4)]

def worker(args):
    snum, lenarg = args
    string = '%s' % snum
    string *= lenarg
    strings[snum].value = string
    return string

# Main progam
data = [(i, numpy.random.randint(1,10)) for i in xrange(4)]

print 'Multi-process'
print "Before: %s" % [item.value for item in strings]
pool = mp.Pool(4)
pool.map(worker, data)
print 'After : %s' % [item.value for item in strings]
输出:

Multi-process
Before: ['', '', '', '']
After : ['0000000', '111111', '222', '3333']

谢谢我自己应该抓到的。运行速度肯定比数据酸洗快。