137 lines
2.9 KiB
Markdown
137 lines
2.9 KiB
Markdown
|
# Multiprocessing
|
||
|
|
||
|
- Crear y detener procesos
|
||
|
- Compartir datos entre procesos.
|
||
|
- [Uso de 'lock' para prevenir 'race-conditions'](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/17_multiprocessing#lock)
|
||
|
- [Uso de 'queue'](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/17_multiprocessing#queue)
|
||
|
- [Pool/Administrar multiples procesos](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/17_multiprocessing#pool)
|
||
|
|
||
|
## Lock
|
||
|
```python
|
||
|
from multiprocessing import Process, Value, Lock
|
||
|
import time
|
||
|
|
||
|
def add_100(numero, lock):
|
||
|
for i in range(100):
|
||
|
time.sleep(0.01)
|
||
|
with lock:
|
||
|
numero.value += 1
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
|
||
|
lock = Lock()
|
||
|
|
||
|
nro_compartido = Value('i', 0)
|
||
|
print('el número al comienzo es', nro_compartido.value)
|
||
|
|
||
|
p1 = Process(target=add_100, args=(nro_compartido, lock))
|
||
|
p2 = Process(target=add_100, args=(nro_compartido, lock))
|
||
|
|
||
|
p1.start()
|
||
|
p2.start()
|
||
|
|
||
|
p1.join()
|
||
|
p2.join()
|
||
|
|
||
|
print('el número al final es', nro_compartido.value)
|
||
|
# el número al comienzo es 0
|
||
|
# el número al final es 200
|
||
|
```
|
||
|
|
||
|
## Array
|
||
|
```python
|
||
|
from multiprocessing import Process, Array, Lock
|
||
|
import time
|
||
|
|
||
|
def add_100(numeros, lock):
|
||
|
for i in range(100):
|
||
|
time.sleep(0.01)
|
||
|
for i in range(len(numeros)):
|
||
|
with lock:
|
||
|
numeros[i] += 1
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
|
||
|
lock = Lock()
|
||
|
|
||
|
array_compartido = Array('d', [0.0, 100.0, 200.0] ) # double
|
||
|
print('Arreglo al comienzo: ', array_compartido[:])
|
||
|
|
||
|
p1 = Process(target=add_100, args=(array_compartido, lock))
|
||
|
p2 = Process(target=add_100, args=(array_compartido, lock))
|
||
|
|
||
|
p1.start()
|
||
|
p2.start()
|
||
|
|
||
|
p1.join()
|
||
|
p2.join()
|
||
|
|
||
|
print('Arreglo al final: ', array_compartido[:])
|
||
|
# Arreglo al comienzo: [0.0, 100.0, 200.0]
|
||
|
# Arreglo al final: [200.0, 300.0, 400.0]
|
||
|
```
|
||
|
|
||
|
## Queue
|
||
|
```python
|
||
|
from multiprocessing import Process, Array, Lock, Queue
|
||
|
import time
|
||
|
|
||
|
def cuadrado(numeros, queue):
|
||
|
for i in numeros:
|
||
|
queue.put(i*i)
|
||
|
|
||
|
def hacer_negativo(numeros, queue):
|
||
|
for i in numeros:
|
||
|
queue.put(-1*i)
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
|
||
|
numeros = range(1,6)
|
||
|
q = Queue()
|
||
|
|
||
|
p1 = Process(target=cuadrado, args=(numeros, q))
|
||
|
p2 = Process(target=hacer_negativo, args=(numeros, q))
|
||
|
|
||
|
p1.start()
|
||
|
p2.start()
|
||
|
|
||
|
p1.join()
|
||
|
p2.join()
|
||
|
|
||
|
while not q.empty():
|
||
|
print(q.get())
|
||
|
# 1
|
||
|
# 4
|
||
|
# 9
|
||
|
# 16
|
||
|
# 25
|
||
|
# -1
|
||
|
# -2
|
||
|
# -3
|
||
|
# -4
|
||
|
# -5
|
||
|
```
|
||
|
|
||
|
## Pool
|
||
|
```python
|
||
|
from multiprocessing import Pool
|
||
|
|
||
|
def cubo(numero):
|
||
|
return numero * numero * numero
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
|
||
|
numeros = range(10)
|
||
|
pool = Pool()
|
||
|
|
||
|
# map, apply, join, close
|
||
|
result = pool.map(cubo, numeros)
|
||
|
# pool.apply(cubo, numeros[0])
|
||
|
|
||
|
pool.close()
|
||
|
pool.join()
|
||
|
|
||
|
print(result)
|
||
|
# [0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
|
||
|
```
|