Threading

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tschaka81
User
Beiträge: 31
Registriert: Donnerstag 24. Januar 2019, 08:15

Hallo an alle,

ich bin derzeit dabei eine Art plugin System in Python zu schreiben. Dafür wollte ich unter anderem Threads benutzen. Derzeit bin ich so weit, dass ich die Threads durch selbstgebaute Events starten kann. Das passt schon einmal. Ich habe nur das Problem, das ich gerne noch eine Information hätte, an welcher Stelle das event aufgetreten ist. Oder anders ausgedrückt: Kann man beim Befehl

Code: Alles auswählen

onCalculationfinished.set()
irgendwie Parameter übergeben, die ich dann in meinen Threads wieder einlesen, also in prog1 bzw prog2 nutzen kann, so wie prog1(e.data(x),e.data(y),e.data(z)) und onCalculationfinished.set().data(x,y,z)?

Derzeit sieht mein "vereinfachter" Code folgendermaßen aus:

Code: Alles auswählen

import threading
import time
import logging

logging.basicConfig(level=logging.DEBUG,
                    format='(%(threadName)-9s) %(message)s',)

def prog1():
  print "test1"

def prog2():
  print "test2"


if __name__ == '__main__':

    Liste = [["onCalculationfinished", "(prog1, prog2)"]]
    for dat in Liste:
      exec("""def main_"""+dat[0]+"""(e, functions):
                while True:
                  event_is_set = e.wait()
                  for func in functions:
                    func()
                  e.clear()""")
      exec(dat[0]+" = threading.Event()")
      exec("t1 = threading.Thread(name='"+dat[0]+"', target=main_"+dat[0]+", args=("+dat[0]+", "+dat[1]+"))")
      exec("t1.daemon = True")
      exec("t1.start()")



    logging.debug('Waiting before calling Event.set()')
    time.sleep(1)
    onCalculationfinished.set()
    time.sleep(1)
    logging.debug('Event is set')
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Was machst Du denn da mit exec??? Funktionen sind wie andere Objekte auch einfache Objekte, die man als Parameter benutzen kann. Da muß man nicht formatierte Strings ausführen. Schreib das mal ohne Exec und benutze eine Queue, der kannst Du Information mitgeben.
tschaka81
User
Beiträge: 31
Registriert: Donnerstag 24. Januar 2019, 08:15

Hi, das mit dem Exec war jetzt auch ein Schnellschuss :=)

Ich werde mir das mal mit den Queue anschauen.

Danke erstmal
Antworten