在Python中对文件进行多处理,然后将结果写入磁盘

在Python中对文件进行多处理,然后将结果写入磁盘,python,python-multiprocessing,Python,Python Multiprocessing,我想做以下工作: 从csv文件读取数据 处理所述csv的每一行(假设这是一个长网络操作) 将结果写入另一个文件 我试着把答案粘在一起,但几乎没有成功。 第二个队列的代码永远不会被调用,因此不会写入磁盘。如何让流程知道还有第二个队列 请注意,我不一定是多处理的粉丝。如果async/wait工作得更好,我完全赞成 到目前为止我的代码 import multiprocessing import os import time in_queue = multiprocessing.Queue() o

我想做以下工作:

  • 从csv文件读取数据
  • 处理所述csv的每一行(假设这是一个长网络操作)
  • 将结果写入另一个文件
我试着把答案粘在一起,但几乎没有成功。 第二个队列的代码永远不会被调用,因此不会写入磁盘。如何让流程知道还有第二个队列

请注意,我不一定是
多处理
的粉丝。如果
async
/
wait
工作得更好,我完全赞成

到目前为止我的代码

import multiprocessing
import os
import time

in_queue = multiprocessing.Queue()
out_queue = multiprocessing.Queue()

def worker_main(in_queue, out_queue):
    print (os.getpid(), "working")
    while True:
        item = in_queue.get(True)
        print (os.getpid(), "got", item)
        time.sleep(1) #long network processing
        print (os.getpid(), "done", item)
        # put the processed items to be written to disl
        out_queue.put("processed:" + str(item))


pool = multiprocessing.Pool(3, worker_main,(in_queue,out_queue))

for i in range(5): # let's assume this is the file reading part
    in_queue.put(i)

with open('out.txt', 'w') as file:

    while not out_queue.empty():
        try:
            value = q.get(timeout = 1)
            file.write(value + '\n')
        except Exception as qe:
            print ("Empty Queue or dead process")

我在执行代码时遇到的第一个问题是:

An attempt has been made to start a new process before the current process has finished 
its bootstrapping phase. This probably means that you are not using fork to start your 
child processes and you have forgotten to use the proper idiom in the main module
我必须将所有模块作用域指令包装在
if\uuuuuu name\uuuuu=='\uuuuu main\uuuuu':
习惯用法中

因为您的目标是迭代文件的行,所以这似乎是一个很好的选择。
imap()
docs指的是
map()
docs,区别在于
imap()
从iterable(在您的情况下,它将是csv文件)惰性地提取下一个项目,如果您的csv文件很大,这将是有益的。因此,从
map()
docs:

此方法将iterable分割为若干个块,以供使用 作为单独的任务提交到流程池

imap()
返回一个迭代器,这样您就可以对流程工作人员生成的结果进行迭代,以完成您必须对其执行的操作(在您的示例中,就是将结果写入文件)

以下是一个工作示例:

import multiprocessing
import os
import time


def worker_main(item):
    print(os.getpid(), "got", item)
    time.sleep(1) #long network processing
    print(os.getpid(), "done", item)
    # put the processed items to be written to disl
    return "processed:" + str(item)


if __name__ == '__main__':
    with multiprocessing.Pool(3) as pool:
        with open('out.txt', 'w') as file:
            # range(5) simulating a 5 row csv file.
            for proc_row in pool.imap(worker_main, range(5)):
                file.write(proc_row + '\n')

# printed output:
# 1368 got 0
# 9228 got 1
# 12632 got 2
# 1368 done 0
# 1368 got 3
# 9228 done 1
# 9228 got 4
# 12632 done 2
# 1368 done 3
# 9228 done 4
out.txt
如下所示:

processed:0
processed:1
processed:2
processed:3
processed:4

请注意,我也不必使用任何队列。

谢谢,这非常有帮助。我在jupiter笔记本上运行我的代码,所以这就是我没有得到相同错误的原因