如何从另一个收集数据时在python中并行运行两个函数?

时间:2018-03-30 20:13:31

标签: python multithreading parallel-processing python-multiprocessing

我是多处理的新手,想要在一个函数中收集数据并同时在另一个函数中写入数据。这是我所拥有的伪代码。

def Read_Data():
 for num in range(0,5):

     ## Read 5  random values

     print('Reading ' + str(values[num]))
 return(values)

def Write_data(values):

 ## Arrange the random values in ascending order

 for num in range(0,5):
     print('Writing' + str(arranged_values[num]))

if __name__=='__main__'
  values = Read_Data()
  Write_data(values)

我希望输出看起来像这样。

reading 1, writing none
reading 3, writing none
reading 5, writing none
reading 4, writing none
reading 2, writing none
reading 7, writing 1
reading 8, writing 2
reading 10, writing 3
reading 9, writing 4
reading 6, writing 5

现在我希望它并行运行的原因是为了确保我一直在收集数据,而不是在修改和打印时丢失数据。

如何使用多处理来实现?

1 个答案:

答案 0 :(得分:2)

这应该说明一些概念。该队列用于在进程之间传递对象。

读者只需在某处获取其值并将其放在队列中。

作者永远监听队列。 添加“TERMINATED”信号是告诉作者永远停止聆听的一种非常简单的方式(使用信号和事件还有其他更有效的方法,但这只是说明了这一概念)。

最后,我们“加入”两个进程以确保它们在退出主进程之前退出(否则它们会在空间和时间中停留)

from multiprocessing import Process, Queue
from time import sleep

def reader(q):
    for i in range(10):
        print("Reading", i)
        q.put(i)
        sleep(1)
    print("Reading TERMINATED")
    q.put("TERMINATE")


def writer(q):
    while True:
        i = q.get()
        if i == "TERMINATE":
            print("Writer TERMINATED")
            break
        print("Writing", i)

q = Queue()

pr = Process(target=reader, args=(q,))

pw = Process(target=writer, args=(q,))

pw.start()

pr.start()

pw.join()
pr.join()