2016-07-22 15 views
0

In meinem Python Script erhalte ich einen konstanten Datenfluss, möchte aber die Daten asynchron durch Aufruf einer asynchronen Methode pushen. Die Daten, die in einem Puffer vorhanden sind, werden immer gepuffert, wenn die Methode verfügbar ist.Python - asynchrone Methoden über Threading verwalten

Um dies zu erreichen, habe ich einen try/catch, der ständig aufgerufen wird, der ein Thread-Objekt erstellt, das eine Methode ausführt (und ich nehme an, wenn die Methode beendet wird) und wenn der Thread die try/catch Breaks ausführt .

import thread 
import threading 
thr = None 
...  

try: 
    if thr.is_alive(): 
    print "thread running" 
    else: 
    thr.Thread(target=move_current_data, args=(data_buffer)) 
    thr.start() 
    data_buffer.clear() 
except NameError: 
    print "" 
except AttributeError: 
    print "  


def move_current_data(data_buffer): 
...  
    return 

Wäre es einfacher und sauberer, dies zu schreiben?

kann ich weitere Informationen zur Verfügung stellen, wenn

benötigt

Antwort

0

Sie eine Warteschlange verwendet werden soll. Ein Thread hat nur die Aufgabe, die Warteschlange zu überwachen und neue Daten auszugeben. Der Haupt-Thread wird nur zur Warteschlange hinzugefügt, wenn neue Daten verfügbar sind.

Beispiel:

import threading 
import queue 

def pusher(q): 
    while True: 
    item = q.get() 
    if item is None: 
     return   # exit thread 
    ...push data... 

def main(): 
    q = Queue.Queue() 
    # start up the pusher thread 
    t = threading.Thread(target = pusher, args=(q)) 
    t.start() 

    # add items 
    q.put(item1) 
    ... 
    q.put(item2) 
    ... 
    ... 
    # tell pusher to shut down when queue is empty 
    # and wait for pusher to complete 
    q.put(None) 
    t.join() 

anzumerken, dass q.put(...) nicht den Haupt-Thread nicht blockiert.

+0

Kann ich t = threading.Thread und t.start() mehrmals aufrufen? Es gibt Zeiten, in denen es keine Daten geben kann, aber ich möchte nicht, dass der Thread beendet wird. – BDillan

+0

In meinem Code wird der Pusher-Thread nicht beendet, wenn Sie keinen None-Wert in die Warteschlange setzen. Setzen Sie daher keinen None-Wert in die Warteschlange, bis das Programm zum Beenden bereit ist. Wenn keine Daten vorhanden sind, blockiert der Pusher-Thread beim Aufruf "Get". – ErikR