2017-08-05 2 views
0

So fand ich ein Beispiel, dasWie führe ich zwei Funktionen gleichzeitig mit einem Objekt aus?

import threading 
from threading import Thread 

def func1(): 
    print 'Working' 

def func2(): 
    print 'Working' 

if __name__ == '__main__': 
    Thread(target = func1).start() 
    Thread(target = func2).start() 

und das funktioniert zeigt.

Aber wie funktioniert es, wenn ich normalerweise ein Objekt mit der Funktion habe. Hier sind 2 Funktionen, die ich normalerweise verwende.

statusbar() 
copyfrom(servername.strip()) 

Wie füge ich servername.strip() zu den folgenden hinzu?

Thread(target = statusbar).start() 
Thread(target = copyfrom).start() 
+0

Ping @Prox, um festzustellen, ob dies behoben wurde. – SwiftsNamesake

Antwort

1

Die target sollte eine Funktion sein, so definieren Sie Ihre eigene Funktion, das tut, was Sie wollen:

def doSomething(): 
    copyfrom(servername.strip()) 

und geben Sie es zu Ihrem Thread.

Thread(target=doSomething).start() 

Wenn Sie es in einer einzigen Zeile tun möchten, können Sie eine anonyme Funktion verwenden:

Thread(target=lambda: copyfrom(servername.strip())).start() 

Wie cᴏʟᴅsᴘᴇᴇᴅ in seiner Antwort erwähnt, können Sie auch Argumente für den Rückruf angeben als Tupel:

Thread(target=copyfrom, args=(servername.strip(),)).start() 
0

Verwenden Sie entweder Lambda oder lokale Funktionen:

Thread(target = lambda: copyfrom(servername.strip())).start() 

oder

def thread_func(): 
    copyfrom(servername.strip()) 
Thread(target = thread_func).start() 

In Python Sie Funktion in Funktion (lokale Funktionen, auch diese Art von Lambda) definieren können, und innerhalb von Funktionen können Namen zugreifen, es ist Funktion Elternteil. Auch nach der Ausführung der ursprünglichen Funktion Beachten Sie, dass dies die Lebensdauer der Objekte in der Funktion der Eltern verlängern wird. Also:

def foo(): 
    s = '... very long string ...' 
    def substr(a, b): 
    return s[a:b] 
    return substr 
a = foo() 

Jetzt können Sie a verwenden s zuzugreifen. Aber solange a existiert, wird s auch, als a behält Bezug auf substr, die Bezug auf s hält.

2

Sie können Argumente an threading.Thread, übergeben, so sollte diese Arbeit:

Thread(target=statusbar).start() 
Thread(target=copyfrom, args=(servername.strip(),)).start() 

Das ist, meiner Meinung nach, ist die einfachste Option.

+0

Gute Antwort für diesen speziellen Anwendungsfall. – SwiftsNamesake

Verwandte Themen