FetchData_Background_decorator

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

 

上一篇:python中的装饰器(Decorator)


下一篇:Decorator装饰模式