这里我创建了一个生产者 - 客户程序,父进程(生产者)创建了许多子进程(使用者),然后父进程读取文件并将数据传递给子进程。
但是,这是一个性能问题,在进程成本太多时间之间传递消息(我认为)。
例如, 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 ,所有麻烦都消失了^ _ ^。
答案 0 :(得分:3)
五个月前我在你的地方。我环顾了好几次,但我的结论是多处理,Python确实存在你描述的问题:
我通过学习C ++解决了这个问题,但它可能不是你想读的......
答案 1 :(得分:0)