Python 多核处理挂起

Python 多核处理挂起,python,python-2.7,pandas,numpy,multiprocessing,Python,Python 2.7,Pandas,Numpy,Multiprocessing,我的代码如下所示。它似乎在proc.join()循环期间“挂起”。如果我用10条记录创建dataframedf,整个过程完成得很快,但从10000条开始(如图所示),那么程序似乎只是挂起。我正在使用htop查看CPU核心的使用情况,我确实看到所有CPU核心的使用率都达到了100%,但在它们回到0%之后很久,程序似乎就不会继续了。你知道我做错了什么吗 import pandas as pd import numpy as np import multiprocessing from multipr

我的代码如下所示。它似乎在
proc.join()循环期间“挂起”。如果我用10条记录创建dataframe
df
,整个过程完成得很快,但从10000条开始(如图所示),那么程序似乎只是挂起。我正在使用
htop
查看CPU核心的使用情况,我确实看到所有CPU核心的使用率都达到了100%,但在它们回到0%之后很久,程序似乎就不会继续了。你知道我做错了什么吗

import pandas as pd
import numpy as np
import multiprocessing
from multiprocessing import Process, Queue

def do_something(df, partition, q):
    for index in partition:
        q.put([v for v in df.iloc[index]])

def start_parallel_processing(df, partitions):
    q = Queue()
    procs = []
    results = []

    for partition in partitions:
        proc = Process(target=do_something, args=(df, partition, q))
        proc.start()
        procs.extend([proc])

    for i in range(len(partitions)):
        results.append(q.get(True))

    for proc in procs:
        proc.join()

    return results

num_cpus = multiprocessing.cpu_count()
df = pd.DataFrame([(x, x+1) for x in range(10000)], columns=['x','y'])
partitions = np.array_split(df.index, num_cpus)
results = start_parallel_processing(df, partitions)
len(results)

它显示为
Queue。Queue
的行为不符合您的要求,并且它不是为在多个进程之间共享而设计的,您必须使用
Manager.Queue()

我添加了一些打印以了解您的代码流

您仍然可以润色代码以使用
Pool()
而不是
num\u CPU

import pandas as pd
import numpy as np
import multiprocessing
import pprint
from multiprocessing import Process, Queue, Manager

def do_something(df, partition, q):
    # print "do_something " + str(len(partition)) + " times"
    for index in partition:
        # print index
        for v in df.iloc[index]:
            #print "sending v to queue: " + str(len(df.iloc[index]))
            q.put(v, False)

    print "task_done(), qsize is "+ str(q.qsize())


def start_parallel_processing(df, partitions):
    m = Manager()
    q = m.Queue()
    procs = []
    results = []
    print "START: launching "+ str(len(partitions)) + " process(es)"
    index = 0
    for partition in partitions:
        print "launching "+ str(len(partitions)) + " process"
        proc = Process(target=do_something, args=(df, partition, q))
        procs.extend([proc])
        proc.start()
        index += 1
        print "launched "+ str(index) + "/" + str(len(partitions)) + " process(es)"

    while True:
        try:
            results.append(q.get( block=False ))
        except:
            print "QUEUE END"
            break

    print pprint.pformat(results)

    process_count = 0
    for proc in procs:
        process_count += 1
        print "joining "+ str(process_count) + "/" + str(len(procs)) + " process(es)"
        proc.join()

    return results

num_cpus = multiprocessing.cpu_count()
df = pd.DataFrame([(x, x+1) for x in range(10000)], columns=['x','y'])
partitions = np.array_split(df.index, num_cpus)
results = start_parallel_processing(df, partitions)
print "len(results) is: "+ str(len(results))

进程排队的记录比取消排队的记录多。您正在调用
q.get
len(分区)
次,但是每个进程都在排队
len(分区[i])
次。基本上,当您调用
join
时,您的进程尚未完成。但是,它们最终应该完成,并且在所有进程完成排队后,您的程序应该退出。@sirfz事实并非如此
proc.join()completely@martineau如果消息是正确的答案,您应该将其标记为“答案”,并且在我的回复旁边会有绿色复选框,Cheers@Mason当前位置简·韦恩问了这个问题。正如您可能从它所在的模块中推断的那样,它的设计正是为了。你一定是把它和我搞混了。OP正在使用
多处理
中的一个。