小肥囊 2021-07-16 00:02 采纳率: 0%
浏览 72

python中多进程与多线程并行运行问题

我想让下面代码中多进程和多线程部分的程序并行运行,但是目前的运行结果是程序会先执行多进程,完毕后才会开始执行多线程程序。
代码如下:

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys
import time
import os
from time import sleep
from pathos.multiprocessing import ProcessingPool as Pool
from tqdm import tqdm


def func(x):
    y = x * 2
    sleep(0.5)
    print('-----\n{}: {}'.format(os.getpid(), x))
    # print('{}: {}\n'.format(multiprocessing.current_process().name, x))
    return y


class TestWindow(QDialog):
    def __init__(self):
        super().__init__()

        self.btn1 = QPushButton("Start", self)
        self.btn2 = QPushButton("Stop", self)
        self.sec_label = QLabel(self)

        layout = QGridLayout(self)
        layout.addWidget(self.btn1, 0, 0)
        layout.addWidget(self.btn2, 0, 1)
        layout.addWidget(self.sec_label, 1, 0, 1, 2)

        self.thread = MyThread()  # 创建一个线程
        self.thread.sec_changed_signal.connect(self.update)  # 线程发过来的信号挂接到槽:update
        # btn1.clicked.connect(lambda: thread.start())

        self.btn1.clicked.connect(self.thread.start)
        self.btn2.clicked.connect(lambda: self.thread.terminate())  # 线程中止

        # with tqdm(total=100) as t:
        #     a = pool.imap(func, range(100))
        #     print(a)
        #     t.update()

        results = pool.map(func, range(100))
        print(results)
        pool.close()
        pool.join()

        print(os.getpid())

    def update(self, sec):
        self.sec_label.setText(str(sec))


class MyThread(QThread):
    sec_changed_signal = pyqtSignal(int)  # 信号类型:int

    def __init__(self, sec=1000, parent=None):
        super().__init__(parent)
        self.sec = sec  # 默认1000秒

    def run(self):

        for i in range(self.sec):
            self.sec_changed_signal.emit(i)  # 发射信号
            time.sleep(1)


if __name__ == '__main__':
    pool = Pool(4)
    app = QApplication(sys.argv)
    form = TestWindow()
    form.show()
    app.exec_()_

  • 写回答

1条回答 默认 最新

  • CSDN专家-黄老师 2021-07-16 12:14
    关注

    你的__init__是先执行多线程再多进程,先执行self.thread = MyThread()再到results = pool.map(func, range(100)),你修改这部分的先后顺序就行了

    评论

报告相同问题?

问题事件

  • 创建了问题 7月16日

悬赏问题

  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问
  • ¥15 用MATLAB汇总拟合图
  • ¥15 智能除草机器人方案设计
  • ¥15 对接wps协作接口实现消息发送
  • ¥15 SQLite 出现“Database is locked” 如何解决?
  • ¥15 已经加了学校的隶属邮箱了,为什么还是进不去github education?😭
  • ¥15 求会做聚类,TCN的朋友有偿线上指导。以下是目前遇到的问题
  • ¥100 无网格伽辽金方法研究裂纹扩展的程序