Python-Funktion im Hauptfaden aus dem Aufruf im Dummy-Thread ausführen

Ich habe ein Python-Skript, das aynchrone Rückrufe von .NET Remoting behandelt. Diese Rückrufe werden in einem Dummy (Worker) Thread ausgeführt. Von meinem Callback-Handler muss ich eine Funktion anrufen, die ich in meinem Skript definiert habe, aber ich brauche die Funktion, um im Haupt-Thread auszuführen.

Der Hauptthread ist ein Remote-Client, der Befehle an einen Server sendet. Einige dieser Befehle führen zu asynchronen Rückrufen.

Grundsätzlich brauche ich das Äquivalent von .NET's Invoke-Methode. Ist das möglich?

Danke, Jim

  • Pyudev - Anrufe funktionieren zweimal
  • Wie kann ich Python-Skript aus Java ausführen?
  • Ist das der richtige Weg, um ein Shell-Skript in Python laufen?
  • Setzen Sie LD_LIBRARY_PATH aus dem Python ein
  • Brauchen Sie Hilfe, um verarbeitete mdb-Datei in Python auf Linux-Maschine zu sortieren
  • Wie zeigt man interaktives SVG in einem Fenster unter Linux an?
  • One Solution collect form web for “Python-Funktion im Hauptfaden aus dem Aufruf im Dummy-Thread ausführen”

    Sie möchten die Warteschlange- Klasse verwenden, um eine Warteschlange einzurichten, die Ihre Dummy-Threads mit Funktionen belegen und dass Ihr Haupt-Thread verbraucht.

     import Queue #somewhere accessible to both: callback_queue = Queue.Queue() def from_dummy_thread(func_to_call_from_main_thread): callback_queue.put(func_to_call_from_main_thread) def from_main_thread_blocking(): callback = callback_queue.get() #blocks until an item is available callback() def from_main_thread_nonblocking(): while True: try: callback = callback_queue.get(False) #doesn't block except Queue.Empty: #raised when queue is empty break callback() 

    Demo:

     import threading import time def print_num(dummyid, n): print "From %s: %d" % (dummyid, n) def dummy_run(dummyid): for i in xrange(5): from_dummy_thread(lambda: print_num(dummyid, i)) time.sleep(0.5) threading.Thread(target=dummy_run, args=("a",)).start() threading.Thread(target=dummy_run, args=("b",)).start() while True: from_main_thread_blocking() 

    Drucke:

     From a: 0 From b: 0 From a: 1 From b: 1 From b: 2 From a: 2 From b: 3 From a: 3 From b: 4 From a: 4 

    Und dann für immer blockiert

    Python ist die beste Programmiersprache der Welt.