lgy514

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
from PyQt5.Qt import QThread, QThreadPool, QRunnable, QObject, QWidget, QApplication, QPushButton, QGridLayout, QTextEdit, pyqtSignal, QTextCursor
import sys
import time
from PyQt5.QtCore import QThread, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import *
from concurrent.futures import *
from multiprocessing import *
import threading
from PyQt5.QtCore import *

g_executor = ProcessPoolExecutor()
g_queues = None
g_threadids = []
g_pool = None
mutex = QMutex()

def getData_med(v=10, *args, **kargs):
    # time.sleep(v/2.0)
    kargs['que'].put(v*2) #进度
    return v

class Task(QRunnable):
    def __init__(self, sigProcessRate, sigDataReturn, fn, *args, **kargs):
        super(Task, self).__init__()
        self.sigProcessRate = sigProcessRate
        self.sigDataReturn = sigDataReturn
        self.fn = fn
        self.args = args
        self.kargs = kargs

    def run(self):
        # global g_threadids
        threadname = threading.currentThread().name
        threadname not in g_threadids and g_threadids.append(threadname)
        self.kargs['que'] = g_queues[g_threadids.index(threadname)]

        r = g_executor.submit(self.fn, *self.args, **self.kargs)
        r.add_done_callback(self.cb)
        while True:
            v = self.kargs['que'].get()
            if v > 99:
                break
            self.sigProcessRate.emit(v)
        # mutex.lock()
        # print("runable end {}".format(threading.currentThread().name), self.kargs['que'])
        # mutex.unlock()
    def cb(self,r):
        self.kargs['que'].put(100)
        self.sigDataReturn.emit([r.result()])


class FetchData_Background_decorator(QObject):
    sigDataReturn = pyqtSignal(list)
    sigProcessRate = pyqtSignal(int)
    def __init__(self, fn, *args, **kargs):
        super(FetchData_Background_decorator, self).__init__()
        self.initContext()
        g_pool.start(Task(self.sigProcessRate, self.sigDataReturn, fn, *args, **kargs))

    @staticmethod
    def initContext():
        mutex.lock()
        global g_pool
        if g_pool is None:
            g_pool = QThreadPool()
            g_pool.globalInstance()
g_pool.setExpiryTimeout(-1) g_pool.setMaxThreadCount(
2) global g_queues g_queues = [Manager().Queue(), Manager().Queue(), Manager().Queue(), Manager().Queue()] mutex.unlock() def p(s,v): mutex.lock() print(s,v) mutex.unlock() if __name__ == '__main__': app = QApplication(sys.argv) win = {} for i in range(4): win[str(i)] = FetchData_Background_decorator(getData_med, v=i) win[str(i)].sigProcessRate.connect(lambda v: p('ProcessRate', v)) win[str(i)].sigDataReturn.connect(lambda v: p('DataReturn', v)) sys.exit(app.exec())

 

posted on 2021-02-10 22:26  lgy514  阅读(56)  评论(0编辑  收藏  举报