Python3.5熊猫多进程:进程永不停止

Python3.5熊猫多进程:进程永不停止,python,pandas,multiprocessing,Python,Pandas,Multiprocessing,我的问题是执行以下操作: multicore_apply(serie, func) 运行 所以我尝试创建一个函数来实现它: 用于在进程中运行apply方法的函数: 过程管理: 我知道I::ncores没有优化,但实际上这不是问题所在: 如果输入len大于30000,则进程永远不会停止 这是对队列()的误解吗 我不想使用多处理.map:要应用的func是一个类中的方法,非常复杂,而且大小相当大,因此共享内存使其速度太慢。在这里,我想在一个队列中传递它,当流程问题得到解决时 感谢您的建议可能会有所

我的问题是执行以下操作:

multicore_apply(serie, func)
运行

所以我尝试创建一个函数来实现它:

用于在进程中运行apply方法的函数: 过程管理: 我知道
I::ncores
没有优化,但实际上这不是问题所在: 如果输入len大于30000,则进程永远不会停止

这是对队列()的误解吗

我不想使用
多处理.map
:要应用的func是一个类中的方法,非常复杂,而且大小相当大,因此共享内存使其速度太慢。在这里,我想在一个队列中传递它,当流程问题得到解决时


感谢您的建议

可能会有所帮助-您可以使用
多处理
库。 您的
多核应用程序(serie,func)
应该如下所示:

from multiprocessing import Pool
pool = Pool()
pool.map(func, series)
pool.terminate()

您可以像下面这样指定要创建的进程数
pool=pool(6)
,默认情况下,它等于机器上的内核数。

经过许多晚上的密集搜索,我在python开发网站上发布了一篇关于队列中对象的最大大小的帖子,解决了这个问题:问题就在这里。我在stackoverflow上使用了另一个帖子,发现:

然后,我完成了以下程序,但对于大型对象,效率不如预期。我将对每个轴执行相同的操作

注意,这个版本允许使用复杂类作为函数参数,而我不能使用pool.map

def adaptator(series, results, ns, i) :
    serie = series[i]
    func = ns.func
    result = serie.apply(func)
    results[i] = result

def parallel_apply(ncores, func, serie) :
    series = pd.np.array_split(serie, ncores, axis = 0)
    M = Manager()
    s_series = M.list()
    s_series.extend(series)
    results = M.list()
    results.extend([None]*ncores)
    ns = M.Namespace()
    ns.func = func
    jobs = []    
    for i in range(ncores) :
        jobs.append(process(target = adaptator, args = (s_series, results, ns, i)))
    for job in jobs :
        job.start()
    for job in jobs :
        job.join()
    print(results)

因此,如果在队列之间放置大型对象,Ipython将冻结

您所说的“我知道I::ncores没有优化,但实际上这不是问题:如果输入len大于30000,进程将永远不会停止…”是什么意思?什么是输入len,
ncores
?您认为代码的时间和空间复杂性是多少。29999行得通吗,还是你从10公里跳到30公里,只是怀疑它没有完成?您在缩放方面有问题,并且没有提供任何数据来提出任何建议。使用selection i::ncores不是很明智,因为我需要排序以获得有序的结果,最好是逐块进行排序。输入len是序列的长度。我知道它在30000的时候崩溃了,因为我一步一步地做到了500。ncores是要启动的concurrect进程数。重要信息:我的操作系统是Linux-Open SUSEThank you,但我的问题是特定于进程的,我已经可以使用pool.map,并且我做了一些与numpy.vectorize相关的改进。
from multiprocessing import Pool
pool = Pool()
pool.map(func, series)
pool.terminate()
def adaptator(series, results, ns, i) :
    serie = series[i]
    func = ns.func
    result = serie.apply(func)
    results[i] = result

def parallel_apply(ncores, func, serie) :
    series = pd.np.array_split(serie, ncores, axis = 0)
    M = Manager()
    s_series = M.list()
    s_series.extend(series)
    results = M.list()
    results.extend([None]*ncores)
    ns = M.Namespace()
    ns.func = func
    jobs = []    
    for i in range(ncores) :
        jobs.append(process(target = adaptator, args = (s_series, results, ns, i)))
    for job in jobs :
        job.start()
    for job in jobs :
        job.join()
    print(results)