Python 如何同时从多处理.Queue()中放置()和获取()?

Python 如何同时从多处理.Queue()中放置()和获取()?,python,python-2.7,parallel-processing,queue,multiprocessing,Python,Python 2.7,Parallel Processing,Queue,Multiprocessing,我正在开发一个python2.7程序,它使用多处理并行执行这些操作: 同时从文件1和文件2读取一行 应用功能(第1行、第2行) 将函数输出写入文件 我是多道处理新手,一般来说我对python不是非常精通。因此,我读了很多已经被问到的问题和教程:我觉得接近要点,但我现在可能错过了一些我不能真正发现的东西 代码的结构如下所示: from itertools import izip from multiprocessing import Queue, Process, Lock nthreads

我正在开发一个
python2.7
程序,它使用
多处理并行执行这些操作:

  • 同时从
    文件1
    文件2
    读取一行
  • 应用
    功能(第1行、第2行)
  • 将函数输出写入文件
我是多道处理新手,一般来说我对python不是非常精通。因此,我读了很多已经被问到的问题和教程:我觉得接近要点,但我现在可能错过了一些我不能真正发现的东西

代码的结构如下所示:

from itertools import izip
from multiprocessing import Queue, Process, Lock

nthreads = int(mp.cpu_count())
outq = Queue(nthreads)
l = Lock()

def func(record_1, record_2):
     result = # do stuff
     outq.put(result)

OUT = open("outputfile.txt", "w")
IN1 = open("infile_1.txt", "r")
IN2 = open("infile_2.txt", "r")

processes = []
for record_1, record_2 in izip(IN1, IN2):
     proc = Process(target=func, args=(record_1, record_2))
     processes.append(proc)
     proc.start()

for proc in processes:
     proc.join()

while (not outq.empty()):
     l.acquire()
     item = outq.get()
     OUT.write(item)
     l.release()

OUT.close()
IN1.close()
IN2.close()
就我对作为软件包的多处理的理解(到目前为止),我正在做的是:

  • 为函数结果创建一个队列,该队列的大小限制与机器的内核数兼容
  • 使用
    func()
    的结果填充此队列
  • 读取队列项目,直到队列为空,并将其写入输出文件
现在,我的问题是,当我运行这个脚本时,它立即变成了一个僵尸进程。我知道该函数可以工作,因为没有多处理实现,我就得到了想要的结果


我希望从这两个文件中读取数据,同时写入输出,以避免从输入文件生成一个巨大的列表,然后再读取它(输入文件很大)。你认为有什么严重的、完全错误的或可以改进的吗?

我看到的最大问题是,你应该通过进程传递队列对象,而不是试图在函数中使用它作为全局对象

def func(record_1, record_2, queue):
     result = # do stuff
     queue.put(result)

for record_1, record_2 in izip(IN1, IN2):
     proc = Process(target=func, args=(record_1, record_2, outq))
此外,正如当前编写的一样,您仍然会将所有信息拉入内存(也称为队列),并等待读取完成后再写入输出文件。您需要将
p.join
循环移动到读取队列之后,而不是将队列中的所有信息都放在
func
的末尾,而是在一段时间内用循环中的卡盘填充队列,否则就等同于将其全部读入内存


您也不需要锁,除非您在辅助函数
func
中使用它,如果需要,您将再次希望将其传递

如果您不想在内存中读取/存储大量数据,我会在迭代输入文件的同时写出这些数据。下面是一个将每行文件组合在一起的基本示例

with open("infile_1.txt") as infile1, open("infile_2.txt") as infile2, open("out", "w") as outfile:
    for line1, line2 in zip(infile1, infile2):
        outfile.write(line1 + line2)

我不想写太多关于这些的东西,只是想给你一些想法。如果你想了解更多细节,请告诉我。希望有帮助

谢谢!你在文章末尾写的方式正是我在尝试实现多处理之前写的方式。我的功劳哈哈:)“你需要移动p.join循环,直到读完队列”我不确定我是否明白你的意思。“你也不需要锁,除非你在worker函数中使用它”:你的意思是我应该按照你为队列建议的那样通过它,对吗?@Macspider For
p.join
我的意思是将整个For循环
For proc in processs:proc.join()
移动到
while
循环下。对于锁问题,是的,把它作为
func
的另一个参数输入,并像队列一样传递它。