代码之家  ›  专栏  ›  技术社区  ›  Shawn

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

  •  0
  • Shawn  · 技术社区  · 7 年前

    我不熟悉多处理,希望在一个函数中收集数据,同时在另一个函数中写入数据。这是我的密码。

    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 回复  |  直到 7 年前
        1
  •  2
  •   Will    7 年前

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

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

    写入程序将永远监听队列。 添加“终止”信号是一种非常简单的方法,可以告诉作者永远停止倾听(还有其他更有效的方法使用信号和事件,但这只是说明了这个概念)。

    最后,我们“连接”这两个进程,以确保它们在退出主进程之前退出(否则它们将在空间和时间上悬而未决)

    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()