threads - python programacion concurrente
Cómo hacer programación paralela en Python (4)
Para C ++, podemos usar OpenMP para hacer programación paralela, sin embargo, OpenMP no funcionará para Python, ¿qué debo hacer si quiero poner en paralelo algunas partes de mi programa python? La estructura del código se puede considerar como:
solve1(A)
solve2(B)
donde resolver1 y resolver2 son dos funciones independientes. ¿Cómo ejecutar este tipo de código en paralelo en lugar de en secuencia para reducir el tiempo de ejecución? Espero que alguien pueda ayudarme. Muchas gracias de antemano. El código es:
def solve(Q,G,n):
i = 0
tol = 10**-4
while i < 1000:
inneropt,partition,x = setinner(Q,G,n)
outeropt = setouter(Q,G,n)
if (outeropt - inneropt)/(1 + abs(outeropt) + abs(inneropt)) < tol:
break
node1 = partition[0]
node2 = partition[1]
G = updateGraph(G,node1,node2)
if i == 999:
print "Maximum iteration reaches"
print inneropt
donde setinner y setouter son dos funciones independientes, y es ahí donde quiero hacer paralelo ...
CPython usa Global Interpreter Lock que hace que la programación en paralelo sea un poco más interesante que C ++
Este tema tiene varios ejemplos útiles y descripciones del desafío:
Esto se puede hacer muy elegantemente con Ray .
Para poner en paralelo su ejemplo, necesita definir sus funciones con el decorador @ray.remote
, y luego invocarlas con .remote
.
import ray
ray.init()
# Define the functions.
@ray.remote
def solve1(a):
return 1
@ray.remote
def solve2(b):
return 2
# Start two tasks in the background.
x_id = solve1.remote(0)
y_id = solve2.remote(1)
# Block until the tasks are done and get the results.
x, y = ray.get([x_id, y_id])
Hay una serie de ventajas de esto sobre el módulo de multiprocessing .
- El mismo código se ejecutará en una máquina multinúcleo y en un conjunto de máquinas.
- Los procesos comparten datos de manera eficiente a través de la memoria compartida y la serialización de copia cero .
- Los mensajes de error se propagan muy bien.
Estas llamadas a funciones se pueden componer juntas, por ejemplo,
@ray.remote def f(x): return x + 1 x_id = f.remote(1) y_id = f.remote(x_id) z_id = f.remote(y_id) ray.get(z_id) # returns 4
- Además de invocar funciones de forma remota, las clases se pueden instanciar de forma remota como actors .
Tenga en cuenta que Ray es un marco que he estado ayudando a desarrollar.
Puedes usar el módulo de multiprocessing . Para este caso, podría usar un grupo de procesamiento:
from multiprocessing import Pool
pool = Pool()
result1 = pool.apply_async(solve1, [A]) # evaluate "solve1(A)" asynchronously
result2 = pool.apply_async(solve2, [B]) # evaluate "solve2(B)" asynchronously
answer1 = result1.get(timeout=10)
answer2 = result2.get(timeout=10)
Esto generará procesos que pueden hacer un trabajo genérico para usted. Como no pasamos los processes
, generará un proceso para cada núcleo de CPU en su máquina. Cada núcleo de CPU puede ejecutar un proceso simultáneamente.
Si desea asignar una lista a una sola función, haría esto:
args = [A, B]
results = pool.map(solve1, args)
No use subprocesos porque GIL bloquea cualquier operación en objetos Python.
Si se refiere a la programación concurrente, puede usar el multiprocessing en Python.
Si quieres hacer algunos análisis de datos paralelos a gran escala en paralelo, prueba Anaconda , que ahora es gratis.