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?
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
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.
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 decorator
y 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.
Eduardo
Una opción, que parece que hace que se ejecuten dos funciones. al mismo
tiempoestá 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.
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é.
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()
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()
Posible duplicado de Python: ¿Cómo puedo ejecutar funciones de Python en paralelo?
– perro naranja
30 de junio de 2016 a las 14:20