如何在Python中按以下方式运行并行任务?

时间:2019-09-22 13:04:46

标签: python pandas multiprocessing

我希望能够执行如图所示的任务。该功能:

  1. 读取数据集
  2. 应用一些转换
  3. 并行执行将数据集导出到csv,并在保存csv时将数据集返回为pd.DataFrame

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以这样做:

import threading

def thread_function(df):
    df.to_csv()

def blue_function(df):
    thread = threading.Thread(target=thread_function, args=(df,))
    thread.start()

在文档中,不必调用thread.join()等待其完成,因为:

  

主线程不是守护程序线程,因此在主线程中创建的所有线程默认为daemon = False。没有活动的非守护线程时,整个Python程序将退出。

编辑:

这样做,您会为过程生成一个新的Thread。这使OS可以独立安排过程的运行时间。这样做的好处是一个线程不必等待另一个线程完成。因此,使您的代码为Asynchronous,而不是并行代码。

在其他编程语言中,它还允许OS安排线程在不同的CPU内核上运行,从而使它们并行运行。但是,由于GIL,在Python中这是不可能的,因为C阻止Python一次运行多个Interpreter实例。

您可以启动一个新进程,而不是一个线程,但是这只会带来更多的开销(时间和内存),并且没有任何优势。 Chrome会生成进程而不是浏览器标签的线程,但是出于安全原因,它会生成。由于进程不共享堆内存。

如果您确实需要并行运行任务,则唯一的选择是在call that from Pythonenter image description here中编写线程部分。

答案 1 :(得分:2)

如果我正确理解了您的问题,那么此代码适合您:

import pandas as pd
from multiprocessing import Lock, Process
from time import time

def writefile(df,lock, filename):
    lock.acquire()
    df.to_csv(filename, index=False, mode='a', header=False)
    lock.release()


if __name__ == '__main__':
    N = 10000000

    df = pd.DataFrame({'a':range(1, N),'b':range(1, N),'c':range(1, N)})
    filename= "tmp.csv"

    start = time()
    df.to_csv(filename, index=False, mode='a', header=False)
    print("Standard execution time:", time() - start, 'seconds')

    start = time()
    lock = Lock()
    p = Process(target=writefile, args=(df,lock, filename))
    p.start()
    p.join()
    print("Multiprocessing execution time:", time() - new, 'seconds')

使用多处理方式将比默认方式消耗更多时间。通过在进程之间使用同步,可以使用Processes and Lock来并行执行写入过程。