研二硕, 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 重写?这是我查到的方法,就是不知道应该怎么学习这个混编的知识。
谢谢。
5399 次点击
所在节点    Python
68 条回复
gangdong
2020-10-14 14:15:45 +08:00
@no1xsyzy 谢谢 ,我学习一下。
iqxd
2020-10-14 14:53:56 +08:00
好像 windows 和 linux 下的 python 多进程是有些区别的,linux 的底层是 fork. 如果是调用了 numpy 做计算,用线程调用影响也没那么大吧,numpy 在 C 层面是会用到多核计算的.
gangdong
2020-10-14 16:13:05 +08:00
@iqxd 关于最后一句我刚开始也是这样想的,但是我自己看 cpu 占用的时候,确实只有一个核心
E520
2020-10-14 18:32:02 +08:00
易语言
gangdong
2020-10-14 21:04:56 +08:00
@BingoXuan 你好,请问怎么在 qt 启动的时候开启多进程呢
gangdong
2020-10-14 21:36:28 +08:00
@knightdf 你好,我今天尝试了在 ui 线程里创建新的计算线程,然后在计算线程里开启多进程。还是有问题。
我查了一下,问题大概是:在 windows 上子进程 一定要放在 if __name__ == '__main__' 下面。
您当初的程序是在 windows 上开发的吗
BingoXuan
2020-10-14 22:24:44 +08:00
@gangdong
主进程先启动计算进程,然后进去界面 main 函数,等待界面 main 结束后就传递信号给计算进程结束任务,最后关闭所有资源。
gangdong
2020-10-14 22:55:36 +08:00
@no1xsyzy 你好,我看你的代码的时候有一个地方我没在其他教程里面见过,就是 @btn.clicked.connect 这个装饰器的写法,请问是自创的吗😂 哪里可以看到这种写法呢
no1xsyzy
2020-10-15 09:16:13 +08:00
@gangdong 至少我是看 Python3.9 的 What's New 时看到的……
https://www.python.org/dev/peps/pep-0614/
gangdong
2020-10-15 09:46:08 +08:00
@no1xsyzy 谢谢。
gangdong
2020-10-15 10:43:43 +08:00
@knightdf
import sys
from PyQt5.QtWidgets import QMainWindow,QApplication,QWidget
from untitled import *
from PyQt5.QtWidgets import QFileDialog
from multiprocessing import Pool
from PyQt5.QtCore import QObject,pyqtSignal,QThread
import time,os


class LoadFiles(QObject):
run_end=pyqtSignal()
def __init__(self):
super(LoadFiles, self).__init__()
def run(self):
testFL = [1, 2, 3, 4, 5, 6]
pool = Pool(6)
pool.apply_async(self.work)
pool.close()
pool.join()
self.run_end.emit()

def work(self):
# fn: 函数参数是数据列表的一个元素
fn=100
print('当前进程: {}'.format(os.getpid()), time.time())
time.sleep(10)
print(fn * fn)


class PrecessTest(QMainWindow,Ui_MainWindow):
def __init__(self):
super(PrecessTest, self).__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.load_files)

def load_files(self):
self._loadThread=QThread()
self.loadThread=LoadFiles()
self.loadThread.run_end.connect(self.stop_thread)
self.loadThread.moveToThread(self._loadThread)
self._loadThread.started.connect(self.loadThread.run)
# openfile_name = QFileDialog.getOpenFileNames(self,'选择文件',"./","TDMS Files(*.tdms)")
# print(openfile_name)
self._loadThread.start()
print('现在线程状态 :', self._loadThread.isRunning())

def stop_thread(self):
self._loadThread.quit()
self._loadThread.wait()
print('现在线程状态 :', self._loadThread.isRunning())
if __name__ == '__main__':
app=QApplication(sys.argv)
ui=PrecessTest()
ui.show()
sys.exit(app.exec_())

你好,我简单的写了一下,这样的话就是不能开多进程,因为开启多进程的部分在 windows 上应该在__main__:的下面,我就不知道如何操作了,主要的问题应该是在子线程下面无法创建多进程?
我是新人,没办法使用 gist 添加外部链接不好意思。。。
gangdong
2020-10-15 10:48:49 +08:00
@no1xsyzy
能麻烦看看我上面的代码回复吗,我不知道如何让将创建进程池的部分代码放在 if __name__ == '__main__' 下面(为了避免 ui 堵塞,我得将计算部分新建一个线程,这样如何在这个新的线程中建立多进程呢...)
gangdong
2020-10-15 10:55:24 +08:00
@lpts007
您好,我在上面粘贴了我的代码,就是在 QThread 线程中的多进程是无效的
knightdf
2020-10-15 13:10:17 +08:00
@gangdong 刚上 v2,我是 mac 下开发的,但是在 windows 上打包的,所以平台应该不影响。
没缩进太难看了,贴个你的示例吧 https://gist.github.com/knightdf/657b5418a9ec11ec1138464b37d1c14c
照你的逻辑手打的,可能 typo
Asfy
2020-10-15 13:32:07 +08:00
和我毕业设计差不多啊
量化分析,pyqt 展示
跑个算法, 界面卡死.
要用 python, 直接分两个服务 数据和界面.
数据服务换语言写, 界面 python 搞, 甚至界面可以直接换掉.
gangdong
2020-10-15 17:20:07 +08:00
@Asfy 界面的话。qt pyqt 都差不多,你是说后台的数据处理换语言是吧,请问你用的什么写的😂
no1xsyzy
2020-10-15 20:45:35 +08:00
@gangdong 你还是贴网络剪贴板里吧,C-like 还能自动格式化,Python 没缩进就彻底乱了。
gangdong
2020-10-15 21:28:56 +08:00
@no1xsyzy
你好,coder_gang 中间需要一个斜杠
gangdong
2020-10-15 21:29:58 +08:00
@no1xsyzy
这个是网络剪切板的后缀....
gangdong
2020-10-15 22:05:22 +08:00
@knightdf
我在 mac 上也试了,还是调用不成功,但是也不报错...

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

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

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

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

© 2021 V2EX