Last active
June 7, 2019 18:32
I'm trying to manage a list of threads and from own signal emit self at end of run job, slot connected should remove thread (but it doesn't). Why ?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from PyQt5.QtCore import QObject, QThread, QSemaphore, QReadWriteLock, pyqtSignal, pyqtSlot | |
import random, time | |
class Share(): | |
data = dict() | |
def __init__(self, key, value): | |
Share.data[key] = value | |
@staticmethod | |
def get(key): | |
return Share.data[key] | |
@staticmethod | |
def set(key, value): | |
if isinstance(value, int): | |
print("new value:", value) | |
Share.data[key] = value | |
else: | |
raise Exception("Need to be an int") | |
@staticmethod | |
def multiply(key, value): | |
Share.data[key] *= value | |
class Worker(QThread): | |
sma = QSemaphore(QThread.idealThreadCount()) | |
mutex = QReadWriteLock() | |
end = pyqtSignal(Worker) | |
count = 0 | |
def __init__(self, state, data, key): | |
super().__init__() | |
Worker.count += 1 | |
self.number = Worker.count | |
self.state = state | |
self.data = data | |
self.key = key | |
self.finished.connect(self.__del__) | |
def __del__(self): | |
self.quit() | |
self.deleteLater() | |
def run(self): | |
self.sma.acquire() | |
factor = random.randint(1, 10) | |
operation = factor if self.state else 1 / factor | |
wait = random.randint(1,10) | |
self.mutex.lockForWrite() | |
print("thread", self.number, "running | operation =>", operation, \ | |
"| threads aviable =>", self.sma.available()) | |
time.sleep(wait) | |
self.data.multiply(self.key, operation) | |
print("from", self.number, "data = ", self.data.get(self.key)) | |
self.mutex.unlock() | |
self.end.emit(self) | |
class Test(QObject): | |
def __init__(self, origin): | |
super().__init__() | |
self.w = list() | |
for i in range(2,15): | |
state = random.randint(0,1) | |
new_worker = Worker(state, origin, "a") | |
new_worker.end.connect(self.on_end) | |
self.w.append(new_worker) | |
print("there is", len(self.w), "workers running") | |
self.w[i-2].start() | |
while len(w) != 0: | |
time.sleep(1) | |
print("finally, origin is", origin) | |
@pyqtSlot(Worker) | |
def on_end(self, worker): | |
print("bye bye", worker.number) | |
del self.w[worker] | |
origin = Share("a", 1) | |
ok = Test(origin) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment