2010-06-02 12 views
24

Ich versuche, 2 Funktionen zur gleichen Zeit laufen zu lassen.Machen Sie 2 Funktionen zur gleichen Zeit

def func1(): 
    print 'Working' 

def func2(): 
    print 'Working' 

func1() 
func2() 

Weiß jemand, wie man das macht?

+0

Mögliche Duplikate von [Python: Wie kann ich Python-Funktionen parallel ausführen?] (Http://stackoverflow.com/questions/7207309/python-how-can-i-run-python-functions-in-parallel) – OrangeDog

Antwort

46

tun:

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() 
+12

Vielleicht möchte er wissen, dass sie wegen der Global Interpreter Lock nicht zur genau gleichen Zeit ausgeführt werden, selbst wenn die Maschine mehrere CPUs hat. http://wiki.python.org/moin/GlobalInterpreterLock –

+0

@joaquin - Ihr Recht, leider vergessen, die Funktionen nach dem Kopieren und Einfügen zu entfernen. – chrissygormley

+0

das Forkbombs mein System. – KI4JGT

9

The answer about threading ist gut, aber man braucht ein bisschen genauer zu sein, was Sie tun wollen.

Wenn Sie zwei Funktionen haben, die beide eine Menge CPU verwenden, wird Threading (in CPython) wahrscheinlich nirgendwohin führen. Dann möchten Sie vielleicht einen Blick auf die multiprocessing module werfen oder möglicherweise möchten Sie jython/IronPython verwenden.

Wenn CPU-gebundene Leistung der Grund ist, könnten Sie sogar Dinge in (ohne Gewinde) C implementieren und eine viel größere Beschleunigung als täte zwei parallele Dinge in Python bekommen.

Ohne weitere Informationen ist es nicht einfach, eine gute Antwort zu finden.

5

Die Methode erscheint das threading Modul (beschrieben in another Antwort auf diese Frage) zu
laufen zwei Funktionen gleichzeitig zu arbeiten, aber tatsächlich eine kleine Verzögerung zwischen, wie
im Official Python Documentation angegeben. Eine bessere Lösung, um stattdessen zu versuchen, ist die Verwendung der multiprocessing module.

Außerdem gibt es einige andere nützliche Python-Module, die für die asynchrone Ausführung verwendet werden können (zwei Codeteile gleichzeitig). Für einige Informationen darüber, welche Option am besten geeignet ist, besuchen Sie die Stack Overflow-Frage unter https://stackoverflow.com/q/2629680/3787376).

Zitat aus der offiziellen Python-Dokumentation über threading module nicht funktioniert:

CPython Implementierung Detail: In CPython aufgrund des globalen Interpreter Lock, nur ein Thread zu Python-Code ausführen kann einmal (auch obwohl bestimmte leistungsorientierte Bibliotheken diese Einschränkung überwinden könnten). Wenn Sie Ihre Anwendung eine bessere Nutzung der die Rechenressourcen von Multi-Core-Maschinen zu machen, werden Sie zu Verwendung Multiprozessing oder concurrent.futures.ProcessPoolExecutor beraten. Threading ist jedoch immer noch ein geeignetes Modell, wenn Sie gleichzeitig mehrere I/O-gebundene Tasks ausführen möchten.


A comment von einem anderen Benutzer über die threading module:

Er könnte, dass sie wegen des Global Interpreter Lock wollen wissen, wird auf die exakt gleiche Zeit, auch wenn die Maschine nicht ausführen in Frage hat mehrere CPUs. wiki.python.org/moin/GlobalInterpreterLock

- Jonas Elfström Jun 2 '10 at 11:39

+0

Ich füge time.time() am Ende jeder print() -Funktion an und beschränke die Schleife auf 9 mal auf den Code der anderen Antwort. Hier ist, was ich in meinem Terminal sehe: ('a', 1509314761.857559) ('a', 1509314761.857664) ('a', 1509314761.85767) ('a', 1509314761.857675) ('a', 1509314761.85768) ('a', 1509314761.857685) ("a", 1509314761.85769) ("a", 1509314761.857695) ("a", 1509314761.857699) ("b", 1509314761, 858138) ("b ', 1509314761.858224) (" b', 1509314761.858229) ("b ', 1509314761.858234) ('b', 1509314761.858239) ('b', 1509314761.858244) ('b', 1509314761.858249) ('b', 1509314761.858253) ('b', 1509314761.858258) – weefwefwqg3

+0

Selbst mit Multiprocessing ist es nicht wirklich gleichzeitig Ritus? Einer läuft dem anderen nach. – weefwefwqg3

+1

Meine alte Antwort, die schlecht geschrieben wurde (verbesserte Inhalte, machte es klarer und formatiert/strukturiert besser) gereinigt. – Edward

5

ich diesen Code lief, wenn die Funktionen zur gleichen Zeit laufen zu überprüfen:

#! /usr/bin/env python 
import threading 
from threading import Thread 
import time 

def time1(): 
    time.sleep(1) 
    print time.time() 

def time2(): 
    time.sleep(1) 
    print time.time() 

if __name__ == '__main__': 
    Thread(target = time1()).start() 
    Thread(target = time2()).start() 

Dies ist, was es gibt:

1447425262.16 1447425263.16

Zu mir dies scheint, als ob die Funktionen nacheinander laufen ...?

+0

Sie laufen nacheinander ab, wie Ihr Experiment beweist, wie [die offizielle Python-Dokumentation sagt] (https://docs.python.org/3.3/library/threading.html). Ich habe dieses Zitat auch auf die gleiche Frageseite gesetzt ([zu meiner Antwort] (http://stackoverflow.com/a/33064260/3787376)). – Edward

+1

Bis zur Party aber: Der Grund, warum dies verwirrend scheint, ist, dass der Parameter 'target' im Konstruktor 'Thread' nicht die Funktionen 'time1' und 'time2' ist, sondern die Rückgabewerte von 'time1()' und ' time2() '(siehe Klammern). Im Wesentlichen führen Sie zwei Threads mit "target = None" aus. Die beiden Funktionen werden beim Erstellen der Threads ausgeführt, nicht beim Starten. Hoffnung, die jede Verwirrung aufhebt. –

+0

Es zeigt ein anderes Timing für mich .. Es läuft nicht zur gleichen Zeit – lalithkumar

Verwandte Themen