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

当一个函数从另一个函数收集数据时,如何在python中并行运行两个函数?,python,multithreading,parallel-processing,python-multiprocessing,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

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

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
现在我希望它并行运行的原因是确保我一直在收集数据,并且在修改和打印时不会丢失数据


如何使用多处理来实现这一点?

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

读取器只需在某个地方获取其值并将其放入队列中

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

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


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

读取器只需在某个地方获取其值并将其放入队列中

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

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


对不起,打错了。我将其更正为在线程/进程之间传递对象。但我觉得我用得不对。我对文档不是很了解。这就是我改变的。我将它改为q.put(值),而不是return。然后,p1=Process(target=Read_Data,args=(q,))p1.start()p2=Process(target=Write_Data,args=(q.get()))p2.start()将多处理/线程放在一边,您可以将
Read_Data
转换为生成单个值的生成器,然后对Read_Data()中的值执行类似
的操作:Write_Data(value)
@a_客人,我没找到你。你如何通过只读取一个值来实现它?您不需要至少两个值来比较和排列它们吗?你愿意和我分享一个伪代码吗?对不起,输入错误。我将其更正为在线程/进程之间传递对象。但我觉得我用得不对。我对文档不是很了解。这就是我改变的。我将它改为q.put(值),而不是return。然后,p1=Process(target=Read_Data,args=(q,))p1.start()p2=Process(target=Write_Data,args=(q.get()))p2.start()将多处理/线程放在一边,您可以将
Read_Data
转换为生成单个值的生成器,然后对Read_Data()中的值执行类似
的操作:Write_Data(value)
@a_客人,我没找到你。你如何通过只读取一个值来实现它?您不需要至少两个值来比较和排列它们吗?你愿意分享一个伪代码吗?@Will”““最后,我们“加入”这两个进程,以确保它们在我们退出主进程之前退出(否则它们将挂在空间和时间上)”。非常感谢你澄清这一点。所有这些,我都假设join只是将这两个过程结束在一起。我从未意识到,在主进程连接到子进程之前,它可以确保进程终止。当连接停止阻塞(意味着子进程已退出)时,主进程可以愉快地结束。@Will”““在结束时,我们对两个进程进行“连接”,以确保它们在退出主进程之前退出(否则它们将在空间和时间上挂起)”。非常感谢你澄清这一点。所有这些,我都假设join只是将这两个过程结束在一起。我从未意识到,在主进程连接到子进程之前,它可以确保进程终止。当连接停止阻塞(意味着子节点已退出)时,主节点可以愉快地结束。
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()