2021-06-28

Python中先启动子线程,后面跟进使用多进程。为什么子线程没有并行运行,而是先运行了多进程,然后才启动了子线程。

代码如下:

// An highlighted block
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time    : 2021/6/24 23:41
# @File    : test1.py

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys
import time
from time import sleep
import multiprocessing


def func(x):
    y = x * 2
    sleep(0.5)
    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())  # 线程中止

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

    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 = multiprocessing.Pool(4)
    app = QApplication(sys.argv)
    form = TestWindow()
    form.show()
    app.exec_()

问题主要出在

    self.btn1.clicked.connect(self.thread.start)
    self.btn2.clicked.connect(lambda: self.thread.terminate())  # 线程中止
    results = pool.map(func, range(100))
    print(results)
    pool.close()
    pool.join()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值