¿Cómo ejecutar varias funciones al mismo tiempo?

5 minutos de lectura

Avatar de usuario de John
John

Estoy tratando de ejecutar 2 funciones al mismo tiempo.

def func1():
    print('Working')

def func2():
    print('Working')

func1()
func2()

¿Alguien sabe como hacer esto?

  • Posible duplicado de Python: ¿Cómo puedo ejecutar funciones de Python en paralelo?

    – perro naranja

    30 de junio de 2016 a las 14:20

avatar de usuario de chrisg
chrisg

Hacer esto:

from threading import Thread

def func1():
    print('Working')

def func2():
    print("Working")

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

  • Es posible que desee saber que, debido al bloqueo global del intérprete, no se ejecutarán exactamente al mismo tiempo, incluso si la máquina en cuestión tiene varias CPU. wiki.python.org/moin/GlobalInterpreterLock

    – Jonas Elfström

    2 de junio de 2010 a las 11:39

  • @joaquin: tienes razón, lo siento, olvidé eliminar las ejecuciones de funciones después de copiar y pegar.

    – chrisg

    3 de junio de 2010 a las 8:27

  • ¿Cómo obtener resultados cuando las funciones devuelven algo?

    – estancamientoUno

    17 mayo 2017 a las 12:42

  • No hay razón para usar dos declaraciones de importación. Solo usa el segundo.

    – Federico Rubí

    02/09/2018 a las 17:32

  • ¿Cómo proporcionas argumentos a la función?

    – Vía Láctea90

    25/11/2018 a las 20:10

Avatar de usuario de Mattias Nilsson
matias nilsson

La respuesta sobre subprocesos es buena, pero debe ser un poco más específico sobre lo que desea hacer.

Si tiene dos funciones que utilizan una gran cantidad de CPU, los subprocesos (en CPython) probablemente no lo lleven a ninguna parte. Entonces es posible que desee echar un vistazo a la módulo de multiprocesamiento o posiblemente desee usar jython/IronPython.

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

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

Avatar de usuario de Ion Stoica
estoica de iones

Esto se puede hacer elegantemente con Rayoun sistema que le permite paralelizar y distribuir fácilmente su código Python.

Para paralelizar su ejemplo, necesitaría definir sus funciones con el @ray.remote decoratory luego invocarlos con .remote.

import ray

ray.init()

# Define functions you want to execute in parallel using 
# the ray.remote decorator.
@ray.remote
def func1():
    print("Working")

@ray.remote
def func2():
    print("Working")

# Execute func1 and func2 in parallel.
ray.get([func1.remote(), func2.remote()])

Si func1() y func2() devolver resultados, necesita reescribir un poco el código anterior, reemplazando ray.get([func1.remote(), func2.remote()]) con:

ret_id1 = func1.remote()
ret_id2 = func1.remote()
ret1, ret2 = ray.get([ret_id1, ret_id2])

Hay una serie de ventajas de usar Ray sobre el multiprocesamiento módulo o utilizando subprocesos múltiples. En particular, el mismo código se ejecutará en una sola máquina, así como en un grupo de máquinas.

Para obtener más ventajas de Ray, consulte esta publicación relacionada.

Avatar de usuario de Edward
Eduardo

Una opción, que parece que hace que se ejecuten dos funciones. al mismo
tiempo
está usando el threading módulo (ejemplo en esta respuesta).

Sin embargo, tiene un pequeño retraso, como documentación oficial de Python.
página describe. Un mejor módulo para intentar usar es multiprocessing.

Además, hay otros módulos de Python que se pueden usar para ejecución asíncrona (dos piezas de código trabajando al mismo tiempo). Para obtener información sobre ellos y ayuda para elegir uno, puede leer esta pregunta de desbordamiento de pila.

Comentario de otro usuario sobre el threading módulo

Es posible que quiera saber eso debido al bloqueo global del intérprete.
no se ejecutarán exactamente al mismo tiempo incluso si la máquina en
la pregunta tiene varias CPU. wiki.python.org/moin/GlobalInterpreterLock

— Jonas Elfström el 02 jun.

Cita de la Documentación sobre threading módulo no funciona

Detalle de implementación de CPython: En CPython, debido al Intérprete Global
Lock, solo un subproceso puede ejecutar código de Python a la vez (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 multinúcleo, se recomienda utilizar multiprocesamiento o concurrent.futures.ProcessPoolExecutor.
Sin embargo, el enhebrado sigue siendo un modelo apropiado si
desea ejecutar varias tareas vinculadas a E/S simultáneamente.

Avatar de usuario de I506dk
I506dk

El módulo de subprocesos funciona simultáneamente a diferencia del multiproceso, pero el tiempo es un poco lento. El siguiente código imprime un “1” y un “2”. Estos son llamados por diferentes funciones respectivamente. Me di cuenta de que cuando se imprimían en la consola, tenían tiempos ligeramente diferentes.

from threading import Thread

def one():
    while(1 == num):
        print("1")
        time.sleep(2)
    
def two():
    while(1 == num):
        print("2")
        time.sleep(2)


p1 = Thread(target = one)
p2 = Thread(target = two)

p1.start()
p2.start()

Salida: (Tenga en cuenta que el espacio es para la espera entre la impresión)

1
2

2
1

12
   
21

12
   
1
2

No estoy seguro de si hay una manera de corregir esto, o si es importante. Solo algo que noté.

Avatar de usuario de Shanan Ilen
Shanan Ilen

Prueba esto

from threading import Thread

def fun1():
    print("Working1")
def fun2():
    print("Working2")

t1 = Thread(target=fun1)
t2 = Thread(target=fun2)

t1.start()
t2.start()

Avatar de usuario de Soham Kapoor
soham kapoor

Creo que lo que está tratando de transmitir se puede lograr a través del multiprocesamiento. Sin embargo, si desea hacerlo a través de hilos, puede hacerlo. esto podría ayudar

from threading import Thread
import time

def func1():
    print 'Working'
    time.sleep(2)

def func2():
    print 'Working'
    time.sleep(2)

th = Thread(target=func1)
th.start()
th1=Thread(target=func2)
th1.start()

¿Ha sido útil esta solución?