暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python利用multiprocessing实现多进程,Pyinstaller打包python多进程程序出现多个窗口

捷创源科技 2022-01-31
2221



一、为什么需要采用multiprocessing多线程技术

      自己在做最新文件Hash校验工具V1.0小工具软件时,需要读取文件,计算文件的MD5、SHA1、SHA256和CRC32这些Hash值,对于小文件能够很快计算出hash值,但是对于大文件需要花费一些时间,不知道进度如何?使用进度条指示也无法正确显示进度。后来经过查询资料,使用了multiprocessing多线程技术,这个问题得以解决,记录下自己的一些心得体会。


     号主强烈推荐这款文件Hash校验工具,不仅能够计算出文件Hash信息,而且还有Hash目标值校验功能,省去人工比对的繁琐,操作简单,使用方便!



下载地址:

1.百度网盘衔接:

    链接:https://pan.baidu.com/s/1IZ7JcNYEVjeX--gPv1LRIw 
    提取码:bh6v

    2.阿里云盘衔接:

      https://www.aliyundrive.com/s/zAjyK9T1bDA


      二、Python利用multiprocessing实现多进程

      下面贴出我测试多线程的部分代码:

      main.py

        """
        python主文件
        """
        # -*- coding: utf-8 -*-
        import sys
        from PyQt5.QtWidgets import QApplication, QMainWindow, QDesktopWidget
        import multiprocessing
        import time


        import MyQTMainForm # 导入MyQTMainForm.py文件




        def coding(language):
        """子进程要执行的代码"""
        for i in range(5):
        print("{} coding".format(language), end=' | ')
        time.sleep(1)




        class MyPyQTMainForm(QMainWindow, MyQTMainForm.Ui_MainWindow):
        """
        主界面
        """
        def __init__(self):
        """
        初始化
        """
        super(MyPyQTMainForm, self).__init__()
        self.setupUi(self)


        def center(self):
        """
        定义一个函数使得窗口居中显示
        """
        # 获取屏幕坐标系
        screen = QDesktopWidget().screenGeometry()
        # 获取窗口坐标系
        size = self.geometry()
        newLeft = (screen.width() - size.width()) 2
        newTop = (screen.height() - size.height()) 2
        self.move(int(newLeft), int(newTop))


        def myBtnBrowse(self):
        """
        单击“浏览”按钮消息处理函数
        """
        # 单进程
        start = time.time()
        coding('python')
        for i in range(5):
        print("主程序", end=' | ')
        time.sleep(1)
        end = time.time()
        print('\n单进程花费时间:', end - start)


        # 多进程
        multi_start = time.time()
        p = multiprocessing.Process(target=coding, args=('python',))
        p.start()
        for i in range(5):
        print("主程序", end=' | ')
        time.sleep(1)
        multi_end = time.time()
        print('\n多进程花费时间:', multi_end - multi_start)




        """=====================================
        主函数
        ====================================="""
        if __name__ == '__main__':
        # 使用多进程需要在此处添加
        multiprocessing.freeze_support()


        app = QApplication(sys.argv)
        # 创建主窗口对象
        myPyMainForm = MyPyQTMainForm()
        # 主窗口显示在屏幕中间
        myPyMainForm.center()


        # 显示主界面
        myPyMainForm.show()
        sys.exit(app.exec_())


        运行效果:



        三、Pyinstaller打包python多进程程序,运行出现多个窗口的解决办法

        Pyinstaller版本高于3.3的话,直接在主函数最开始位置添加下面代码即可:

              # 使用多进程需要在此处添加
              multiprocessing.freeze_support()

          效果如下:

            """=====================================
            主函数
            ====================================="""
            if __name__ == '__main__':
            # 使用多进程需要在此处添加
            multiprocessing.freeze_support()


            """这里是你的代码"""
            # ......


            四、PyQt5在对话框中打开外部链接的方法

            利用PyQt5部分控件的Link属性链接


            PyQt5有几个控件带有 setOpenExternalLinks , 如 QLabel、QTextLabel 、 QTextBrowser 等

            当 setOpenExternalLinks 值为TURE 表示可通过html 添加 A 标签打开外部链接, 如设置:



              self.label.setOpenExternalLinks(True)
              self.label.setText(u'<a href="https://datutu.blog.csdn.net/" style="color:#0000ff;"><b> 我的CSDN博客 </b></a>')

              效果如下图:



              文章转载自捷创源科技,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论