研二硕, Python +pyqt,多进程问题求助

2020-10-13 17:02:10 +08:00
 gangdong
现在的毕业课题就是构建一个数据处理软件。属于 cpu 密集型。现在的版本是 python+pyqt 构建的。
因为是 GIL 的关系,不能利用多线程,而且我在 UI 线程中没有办法创建多进程就很蛋疼。
现在我的需求是能够并发(多线程貌似行不通),多进程在 UI 中无法调用。
目前我的就计划有几个:
1. html 界面+python 后端运行(这样应该可以多进程把?是否有老哥有相关经验讲一下)
2. 更换语言做(本人非科班,cpp 皮毛,难度挺大,而且后面还要加入一些聚类算法之类的,python 比较方便)
3. 混编?许需要多线程的地方使用 c 重写?这是我查到的方法,就是不知道应该怎么学习这个混编的知识。
谢谢。
5866 次点击
所在节点    Python
68 条回复
knightdf
2020-10-15 22:22:46 +08:00
@gangdong python 和 qt 是什么版本啊?
no1xsyzy
2020-10-15 22:33:17 +08:00
@gangdong ……找了一圈才发现有个网络剪贴板名字就叫“网络剪贴板” …… 其实是指 pastebin[.]com 和 paste.ubuntu[.]com 这些

还是先 https://stackoverflow.com/help/minimal-reproducible-example

Pool 里不要传 bound method,会导致整个实例被 pickle,然而 QObject 不能被 pickle
把 LoadFiles.work 搞成 staticmethod 或者 classmethod 或者干脆提出去当作单独函数处理。

https://gist.github.com/no1xsyzy/ef171f987a2e78e5f831e523a14c7e9e#file-v2_714573_2-py-L30-L34

你得明白一点,multiprocessing 的基础是 pickle,一切内容都是 pickle 之后通过管道传递到新进程里面去再解开使用,所以参与计算的任何内容都必须可以被 pickle 。但你继承了 C++ 的对象 QObject,就导致了它不能被 pickle (准确地说,它封装了一个 Qt 的 QObject,所以 classmethod 尽管封了一个 QObject 进去但是可以 pickle,因为类本身只有 binding 没有实际的 C++ 层对象)
另外,还有一点就是非 fork() 的方式均会导致整个文件以其他的 __name__ 重新执行一遍,这就是为什么根据平台会要求 __name__ == '__main__',rev2 里我把 __name__ 在子进程打印出来了,你可以看下。
gangdong
2020-10-16 07:34:02 +08:00
@knightdf
python:3.8.5
pyqt:5.12
no1xsyzy
2020-10-16 09:05:17 +08:00
@gangdong #60 报错的话,似乎 Qt 的封装会导致不打印错误。
用 IDE 把错误捕获一下吧
knightdf
2020-10-16 09:52:17 +08:00
@gangdong 那你参考下这个吧,给 windows 的 multiprocessing 打个 patch 试试
https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessing
gangdong
2020-10-16 14:03:16 +08:00
@no1xsyzy
不好意思才回复,不知道为何今天 gist 一直访问不了,挂了梯子、改 host 也没用...
看我什么时候能访问了看看你贴的示例.谢谢
gangdong
2020-10-16 14:26:47 +08:00
@no1xsyzy
输出的错误是:error cannot pickle 'LoadFiles' object 。 应该就是你说的这个意思了...
gangdong
2020-10-16 15:02:16 +08:00
@no1xsyzy
按照你的提示,我做了修改,https[:]//paste[.]ubuntu[.]com[/]p[/]NjSHMjk6sC,成功了,我正在看你讲的 pickle,谢谢你的帮助。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/714573

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX