2010-06-02 37 views
24

Estoy tratando de ejecutar 2 funciones al mismo tiempo.Hacer que 2 funciones se ejecuten al mismo tiempo

def func1(): 
    print 'Working' 

def func2(): 
    print 'Working' 

func1() 
func2() 

¿Alguien sabe cómo hacer esto?

+0

Posible duplicado de [Python: ¿Cómo puedo ejecutar las funciones de Python en paralelo?] (Http://stackoverflow.com/questions/7207309/python-how-can-i-run-python-functions-in-parallel) – OrangeDog

Respuesta

46

hacer esto:

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

Es posible que desee saber que, debido a Global Interpreter Lock, no se ejecutarán al mismo tiempo, incluso si la máquina en cuestión tiene varias CPU. http://wiki.python.org/moin/GlobalInterpreterLock –

+0

@joaquin - Su derecho, lo siento, olvidó sacar las exectuciones de función después de copiar y pegar. – chrissygormley

+0

este tenedor bombardea mi sistema. – KI4JGT

9

The answer about threading es buena, pero hay que ser un poco más específico sobre lo que quiere hacer.

Si tiene dos funciones que usan mucha CPU, el enhebrado (en CPython) probablemente no lo lleve a ninguna parte. Entonces es posible que desee echar un vistazo a multiprocessing module o posiblemente desee utilizar jython/IronPython.

Si el rendimiento vinculado a CPU es la razón, incluso podría implementar cosas en C (sin subprocesamiento) y obtener una aceleración mucho mayor que hacer dos cosas paralelas en python.

Sin más información, no es fácil obtener una buena respuesta.

5

El método que utiliza el módulo threading (descrito en another respuesta a esta pregunta) a
ejecutar dos funciones al mismo tiempo, que parece funcionar, pero en realidad tiene un pequeño retraso entre, como
afirma en el Official Python Documentation. Una mejor solución para intentar en su lugar es usar el multiprocessing module.

Además, hay algunos otros módulos de Python útiles que se pueden utilizar para la ejecución asincrónica (dos fragmentos de código al mismo tiempo). Para obtener información sobre cuál es la mejor opción, consulte la pregunta sobre desbordamiento de pila en https://stackoverflow.com/q/2629680/3787376).

Presupuesto de la documentación de Python Oficial sobre threading module no funciona:

CPython aplicación detalle: En CPython, debido a la Global intérprete de bloqueo, sólo un hilo puede ejecutar código Python a la vez (incluso aunque ciertas bibliotecas orientadas al rendimiento pueden superar esta limitación). Si desea que su aplicación haga un mejor uso de los recursos computacionales de las máquinas multi-core, se recomienda usar multiprocesamiento o concurrent.futures.ProcessPoolExecutor. Sin embargo, el subprocesamiento sigue siendo un modelo apropiado si desea ejecutar tareas múltiples vinculadas a E/S simultáneamente.


A comment de otro usuario sobre el threading module:

Él podría querer saber que debido al bloqueo global intérprete que no se ejecutará exactamente al mismo tiempo, incluso si la máquina en pregunta tiene varias CPU. wiki.python.org/Moin/GlobalInterpreterLock

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

+0

Anexo time.time() al final de cada función print() y limito el ciclo a 9 veces en el código de la otra respuesta. Esto es lo que veo en mi terminal: ('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

Incluso con multiprocesamiento, ¿no es realmente un rito concurrente? uno corre después del otro. – weefwefwqg3

+1

Limpié mi respuesta anterior, que estaba mal escrita (mejor contenido, más clara y mejor formateada/estructurada). – Edward

5

me encontré con este código para comprobar si las funciones se ejecutan al mismo tiempo:

#! /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() 

Esto es lo que devuelve:

1447425262.16 1447425263.16

A mí esto parece que las funciones se ejecutan una tras otra ...?

+0

Se ejecutan uno tras otro como lo demuestra su experimento, como [dice la documentación oficial de Python] (https://docs.python.org/3.3/library/threading.html). Incluí esta cita en esta misma página de preguntas también ([en mi respuesta] (http://stackoverflow.com/a/33064260/3787376)). – Edward

+1

Tarde para la fiesta pero: la razón por la que esto puede parecer confuso es que el parámetro 'objetivo' en el constructor 'Subproceso' no son las funciones 'time1' y 'time2', sino los valores de retorno de 'time1()' y ' time2() '(nota parantheses). Entonces, esencialmente, estás ejecutando dos hilos con 'objetivo = Ninguno'. Las dos funciones se ejecutan cuando se crean los hilos, no cuando se inician. Espero que aclare cualquier confusión. –

+0

Muestra diferentes tiempos para mí ... No se está ejecutando al mismo tiempo – lalithkumar

Cuestiones relacionadas