from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from multiprocessing import Process, Queue
import time
from concurrent.futures import ThreadPoolExecutor
class MyProcess(Process):
def __init__(self, q, data):
super().__init__()
self.q = q
self.data = data
def run(self):
time.sleep(20) # 模拟耗时操作
print('子进程开始put数据')
self.data.append('123')
self.q.put(self.data)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.q = Queue()
self.data = ['111', '222', '333']
self.max_processes = 2 # 允许的最大子进程数
self.current_processes = 0 # 当前运行的子进程数
self.thread_pool = ThreadPoolExecutor(max_workers=2) # 调整线程池的最大工作线程数
self.process_button = QPushButton('启动子进程', self)
self.process_button.clicked.connect(self.start_child_process)
self.process_button.move(20, 20)
self.print_button = QPushButton('打印数字', self)
self.print_button.clicked.connect(self.start_print_number_thread)
self.print_button.move(20, 60)
def start_child_process(self):
if self.current_processes < self.max_processes:
self.current_processes += 1
self.thread_pool.submit(self.run_child_process)
else:
print("已达到最大子进程数限制")
def run_child_process(self):
p = MyProcess(self.q, self.data)
p.start()
p.join() # 等待子进程完成
# 子进程完成后的逻辑
self.current_processes -= 1
result = self.q.get()
print('主进程获取Queue数据:', result)
def start_print_number_thread(self):
self.thread_pool.submit(self.print_number)
def print_number(self):
time.sleep(5)
print("1")
def close_thread_pool(self):
self.thread_pool.shutdown(wait=True)
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
window.close_thread_pool() # 确保在退出程序时关闭线程池
PyQT线程池可运行代码
于 2024-01-17 22:18:58 首次发布