snafu hat geschrieben:Für mich ist diese Denkweise übrigens ein klarer Grund, von der ernsthaften Nutzung seiner Bibliothek abzuraten. Hier wird sich auf undokumentierte und sehr komplexe Details verlassen, ohne dass es irgendeine Art von Hinweis an den Benutzer in Bezug auf diese Risikofreudigkeit gibt.
Snafu behaupte nicht irgendetwas. Dann zeige mir hier irgendeine Zeile mit undokumentierten komplexen Details. Ich habe jetzt _del__ eingefügt und nach event.wait() muss event.clear() kommen, sonst geht die loop nachher nicht schlafen und das geht auf die Laufzeit. Hier ist eine Queue drin und und von threading der Event und das ist alles dokumentiert:
Code: Alles auswählen
import queue
import threading
class Proxy:
def __init__(self,extern_proxy=None):
if extern_proxy == None: self.extern_proxy = self
else: self.extern_proxy = extern_proxy
self.reset()
def __del__(self): self.extern_proxy.undo_receiveAll(self)
def noop(self): pass
def reset(self):
self.Dictionary = {}
self.owners = {}
self.Queue = queue.Queue()
self.Queue_HighPrio = queue.Queue()
self._register("execute_function",lambda msg: msg())
self.running = False
self.trigger = self.do_work
self.extern_trigger = self.noop
def work(self,*args):
if not self.Queue_HighPrio.empty(): data = self.Queue_HighPrio.get()
elif not self.Queue.empty(): data = self.Queue.get()
else: return False
msgid = data[0]
msgdata = data[1]
if msgid in self.Dictionary:
receivers = self.Dictionary[msgid].items()
for receive,packed in receivers:
if packed: receive((msgid,msgdata))
else: receive(msgdata)
return True
def do_work(self,*args):
if self.running: return
self.running = True
while self.work(): pass
self.running = False
def set_trigger(self,trigger):
self.trigger = trigger
self.extern_trigger = trigger
def loop(self):
self.event = threading.Event()
self.set_trigger(self.event.set)
self.event.set()
while True:
self.event.wait()
self.event.clear()
while self.work(): pass
# sending ==========================================================
def send(self,msgid,msgdata=None):
self.Queue.put((msgid,msgdata))
self.trigger()
# extern send and receive callbacks ==========================================
def do_send_extern(self,message_ids):
for mid in message_ids: self.do_receive(self,mid,self.send_extern,True)
def send_extern(self,message): self.extern_proxy.send(message[0],message[1])
def do_receive_extern(self,message_ids):
for mid in message_ids: self.extern_proxy.do_receive(self,mid,self.receive_extern,True)
def receive_extern(self,message):
self.Queue.put(message)
self.extern_trigger()
# register receiver ================================================
def do_receive(self,owner,msgid,receive,packed=False):
self.Queue_HighPrio.put(("execute_function",lambda: self._do_receive(owner,msgid,receive,packed)))
self.trigger()
def _do_receive(self,owner,msgid,receive,packed):
if not owner in self.owners: self.owners[owner] = {}
self.owners[owner][receive]=msgid
self._register(msgid,receive,packed)
def _register(self,msgid,receive,packed=False):
if msgid not in self.Dictionary: self.Dictionary[msgid] = {}
self.Dictionary[msgid][receive] = packed
# unregister receiver ================================================
def undo_receive(self,owner,msgid,receive):
self.Queue_HighPrio.put(("execute_function",lambda: self._undo_receive(owner,msgid,receive)))
self.trigger()
def _undo_receive(self,owner,msgid,receive):
if owner in self.owners:
if receive in self.owners[owner]: del self.owners[owner][receive]
self._unregister1(msgid,receive)
def _unregister1(self,msgid,receive):
if msgid in self.Dictionary:
receivers = self.Dictionary[msgid]
if receive in receivers:
del receivers[receive]
if len(receivers) == 0: del self.Dictionary[msgid]
# unregister Owner ================================================
def undo_receiveAll(self,owner):
self.Queue_HighPrio.put(("execute_function",lambda: self._undo_receiveAll(owner)))
self.trigger()
def _undo_receiveAll(self,owner):
if owner in self.owners:
messages = self.owners[owner]
del self.owners[owner]
for receive,msgid in messages.items(): self._unregister1(msgid,receive)