Python多处理异常处理数据分块

Python多处理异常处理数据分块,python,exception-handling,pandas,multiprocessing,Python,Exception Handling,Pandas,Multiprocessing,我正在尝试使用多处理模块来加速一些数据处理,其想法是我可以向启动的每个进程发送一块数据,以利用我机器上的所有内核,而不是一次只发送一个 因此,我使用pandas read_fwf()函数为数据构建了一个迭代器,每次chunksize=50000行。我的问题是迭代器最终应该引发StopIteration,我试图在子进程中的Exception块中捕获它,并使用队列将其传递给父线程,让父线程知道它可以停止生成子进程。虽然我不知道出了什么问题,但现在发生的是,它到达了数据的末尾,然后继续生成实际上什么都

我正在尝试使用多处理模块来加速一些数据处理,其想法是我可以向启动的每个进程发送一块数据,以利用我机器上的所有内核,而不是一次只发送一个

因此,我使用pandas read_fwf()函数为数据构建了一个迭代器,每次chunksize=50000行。我的问题是迭代器最终应该引发StopIteration,我试图在子进程中的Exception块中捕获它,并使用队列将其传递给父线程,让父线程知道它可以停止生成子进程。虽然我不知道出了什么问题,但现在发生的是,它到达了数据的末尾,然后继续生成实际上什么都不做的进程

def MyFunction(data_iterator, results_queue, Placeholder, message_queue):

    try:
        current_data = data_iterator.next()
        #does other stuff here
        #that isn't important
        placeholder_result = "Eggs and Spam"
        results_queue.put(placeholder_result)
        return None
    except StopIteration:
        message_queue.put("Out Of Data")
        return None

results_queue = Queue()  #for passing results from each child process
message_queue = Queue()  #for passing the stop iteration message
cpu_count = cpu_count()  #num of cores on the machine
Data_Remaining = True    #loop control
output_values = []       #list to put results in
print_num_records = 0    #used to print how many lines have been processed
my_data_file = "some_data.dat"
data_iterator = BuildDataIterator(my_data_file)

while Data_Remaining:

    processes = []
    for process_num in range(cpu_count):
        if __name__ == "__main__":

            p = Process(target=MyFunction, args=(data_iterator,results_queue,Placeholder, message_queue))  
            processes.append(p)
            p.start()
            print "Process " + str(process_num) + " Started"          #print some stuff to 
            print_num_records = print_num_records + 50000             #show how far along
            print "Processing records through: ", print_num_records   #my data file I am

    for i,p in enumerate(processes):
        print "Joining Process " + str(i)
        output_values.append(results_queue.get())
        p.join(None)

    if not message_queue.empty():
        message = message_queue.get()
    else:
        message = ""
    if message == "Out Of Data":
        Data_Remaining = False
        print "STOP ITERATION NOW PLEASE"
更新: 我发现数据迭代器有问题。我的数据集中大约有800万行,在它处理完800万行之后,它实际上从未返回StopIteration,它不断地返回相同的14行数据。以下是构建我的数据迭代器的代码:

def BuildDataIterator(my_data_file):

    #data_columns is a list of 2-tuples
    #headers is a list of strings
    #num_lines is 50000

    data_reader = read_fwf(my_data_file, colspecs=data_columns, header=None, names=headers, chunksize=num_lines)

    data_iterator = data_reader.__iter__()

    return data_iterator 

首先,我将把
MyFunction
以外的所有内容放入
if\uuuuu name\uuuu==“\uuuu main\uuuu”:
块中。你根本不想让工作进程运行代码,对吗?对,我不想让工作进程运行代码,但我在启动工作进程时没有遇到任何问题,在终止主线程时遇到了问题。