使用多线程处理带有while循环的函数?

时间:2016-07-12 18:16:09

标签: python multithreading multiprocessing

我有一个非常基本的功能,它通过一个目录,读取文件和收集数据,但是这样做太慢,只使用每个核心的四分之一(四核i5 CPU)来处理能力。如何同时运行该功能4次。因为它通过一个相当大的目录,我可以让参数使用random.shuffle()吗?这是我现在的代码:

import multiprocessing

def function():
    while True:
        pass #do the code. variables are assigned inside the function.

with Pool(processes=4) as pool:
    pool.map(function)

因为该功能不带任何参数,我该怎么办?

2 个答案:

答案 0 :(得分:3)

我没有使用map(),据说地图只需要一个可迭代的参数,理论上,您可以将fuction()修改为function(one_arg)或尝试使用空列表或元组或其他可迭代结构,但我没有测试它。

我建议您将所有文件放入队列(可以由进程共享),并将队列共享到多个进程(在您的情况下为4)。完成读取文件后,使用try-except退出。创建4个进程以使用文件队列并退出,直到处理完所有文件。

根据Queue.EmptyTimeoutError

,您可以轻松判断队列是否需要阅读更多文件
from multiprocessing import Process
import Queue

def function(files_queue):
    try:
        filename = files_queue.get(timeout=60)  # set timeout
        with open(filename) as inputs:
            # process lines
            # time consuming work is here
    except (multiprocessing.TimeoutError, Queue.Empty) as toe:
        # queue is empty or timeout
        break 

if __name__ == '__main__':
    files_queue = ...  # put all files into queue
    processes = list()

    # here you need a loop to create 4/multiple processes
    p = Process(target=function, args=(files_queue,))

    processes.add(p)
    p.start()

    for pro in processes:
        pro.join()

答案 1 :(得分:-2)

此方法pool.map(function)将创建4个线程,而不是4个进程。所有这些“多处理”都将在4个线程的同一进程中发生。

我建议根据文档here (Python 2)here (Python 3)使用multiprocessing.Process