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()