研二硕, 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 重写?这是我查到的方法,就是不知道应该怎么学习这个混编的知识。
谢谢。
5666 次点击
所在节点    Python
68 条回复
AX5N
2020-10-13 20:01:30 +08:00
我觉得和 c 混编比较好,就看你有没有能力把重计算部分用 c 来写了。根据你项目的复杂度的不同,不见得有必要一定要让 c 来完成多线程。cpu 密集型不建议纯 python,除非你换解释器,否则即便把 python 玩出花,2 30 倍的性能差距还是跑不掉的。
AX5N
2020-10-13 20:06:10 +08:00
@AX5N 调用 C 库很简单,你用 C 编写个函数,并且将这个函数导出来,然后用 python 去调用这个函数就行了。你可以在 python 上用多线程(协程)去调用这个函数,重活都丢给 c 去干。
gangdong
2020-10-13 21:11:30 +08:00
@knightdf
你好,在我使用多进程的时候,没成功过。请问你的软件多进程部分的代码可以参考一下吗
gangdong
2020-10-13 21:15:56 +08:00
@AX5N 是的老哥,我认真分析了我的程序,其中计算部分的一部分我使用 numpy 来完成的,这部分估计我写也不会比 numpy 更好。另一个需要计算的部分是无法避免的循环,循环的话,c 和 python 不知道是否有较大的性能差距,后面我测试一下。谢谢老哥的认真回复。
gangdong
2020-10-13 21:17:10 +08:00
@ClutchBear 这样是一个思路,现在界面是使用 qt 做的,这条路行不通了,再试试这个。谢谢。
gladuo
2020-10-13 22:07:44 +08:00
混编的话搜索引擎关键词『 pybind11 』
gladuo
2020-10-13 22:09:28 +08:00
楼上说的方案就是你 1. 的方案,只不过界面还是沿用 pyqt 而不用换成 html,计算的部分独立作为服务就好
AX5N
2020-10-13 22:31:36 +08:00
@gangdong 据我所知,c 可以调用 numpy https://numpy.org/devdocs/user/c-info.html
knightdf
2020-10-13 22:35:27 +08:00
@gangdong 在 QThread 里开多进程计算
gangdong
2020-10-13 22:50:50 +08:00
@knightdf 目前我是在 ui 里使用 QThread 开一个线程进行计算,这个应该是线程没问题吧? 你的意思是在 QThread 这个新的线程里再开启多进程?
gangdong
2020-10-13 22:52:09 +08:00
@AX5N 谢谢,我学习学习!
gangdong
2020-10-13 22:52:20 +08:00
@gladuo 谢谢!
snowydec
2020-10-13 23:18:22 +08:00
建议先把版本升级到研三,应该就解决了
BingoXuan
2020-10-13 23:33:54 +08:00
我们公司架构就是 pyqt 启动界面时候开多进程做计算引擎,用 zmq 来做 ipc,非常简单方便
frankjoe
2020-10-14 00:22:37 +08:00
QRunnable 和 QThreadPool 可以用吗?
gangdong
2020-10-14 08:08:14 +08:00
@snowydec 哈哈哈哈谢谢老哥
gangdong
2020-10-14 08:09:52 +08:00
@BingoXuan 谢谢,我在自己尝试一下。一直没有把 pyqt 开启多进程搞定
knightdf
2020-10-14 09:35:09 +08:00
@gangdong 是啊,避免堵塞 UI 线程,在新的线程里做
no1xsyzy
2020-10-14 10:15:30 +08:00
刚随便试了下,除了用 QTimer 非阻塞下了点功夫外没什么问题……
但发现一个坑点:请确保创建 GUI 的代码在 __name__ == '__main__' 下,以及不要拉升 Queue 的位置,一旦拉升就要 pickle,但 Queue 不能 pickle
https://gist.github.com/no1xsyzy/03fb6d436dc3e87a1d2d12505d9234fe
no1xsyzy
2020-10-14 10:25:24 +08:00
好像也不是拉升就要 pickle,刚才 p.start() 一直报 Queue 不能 pickle……
顺便修了下之前运行中再次点击按钮导致卡死的问题

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

https://www.v2ex.com/t/714573

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

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

© 2021 V2EX