在python3

时间:2016-09-25 13:15:11

标签: multithreading performance python-3.x communication

这里我创建了一个生产者 - 客户程序,父进程(生产者)创建了许多子进程(使用者),然后父进程读取文件并将数据传递给子进程。

但是,这是一个性能问题,在进程成本太多时间之间传递消息(我认为)。

例如, 200MB 原始数据,父进程读取和预处理的成本将低于 8 秒,而不仅仅是通过多进程将数据传递给子进程。 > pipe 将花费另一个 8 秒,并且子进程执行剩余工作只花费另一个 3~4 秒。

所以,完整的工作流程花费不到18秒,并且流程之间的通信时间成本超过40%,它比我想象的要大得多,我尝试了多进程。队列经理,他们更糟

我使用的是windows7 / Python3.4。 我有谷歌几天了,POSH可能是一个很好的解决方案,但它不能用python3.4构建

我有三种方式:

1.有没有办法可以在Python3.4的进程之间直接共享python对象?作为POSH

2.是否可以将对象的“指针”传递给子进程,子进程可以将“指针”恢复为python对象?

3.multiprocess.Array可能是一个有效的解决方案,但如果我想共享复杂的数据结构,如列表,它是如何工作的?我应该基于它创建一个新类并提供接口作为列表吗?

EDIT1: 我尝试了第三种方式,但效果更差 我定义了这些值:

  

p_pos = multiprocessing.Value('i')#producer写入位置
      c_pos = multiprocessing.Value('i')#customer read position
      databuff = multiprocess.Array('c',buff_len)#shared buffer

和两个功能:

  

SEND_DATA(MSG)
      get_data()

send_data 函数(父进程)中,它将msg复制到数据库,并通过管道将开始和结束位置(两个整数)发送到子进程。
比在 get_data 函数(子进程)中,它收到了两个位置并从数据库中复制了msg。

在最后,它比使用管道@ _ @

花费两倍

编辑2:
是的,我尝试过Cython,结果看起来不错 我只是将我的python脚本的后缀改为.pyx并编译它,程序加速了15% 毫无疑问,我遇到了“无法找到vcvarsall.bat”和“系统无法找到指定的文件”错误,我花了一整天时间来解决第一个问题,并被第二个问题阻止。
最后,我找到了 Cyther ,所有麻烦都消失了^ _ ^。

2 个答案:

答案 0 :(得分:3)

五个月前我在你的地方。我环顾了好几次,但我的结论是多处理,Python确实存在你描述的问题:

我通过学习C ++解决了这个问题,但它可能不是你想读的......

答案 1 :(得分:0)

要将数据(尤其是大的numpy数组)传递给子进程,我认为mpi4py会非常有效,因为我可以直接处理类似缓冲区的对象。

使用here可以找到使用mpi4py生成进程并进行通信的示例(也使用了trio,但这是另一个故事)。