# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# + id="kPDd_M416jtg"
import multiprocessing as mp
from string import ascii_uppercase
import random
from sys import stdout


# + [markdown] id="mg3ZIdy234VM"
# **OBJETIVO:**
#
# El objetivo de esta tarea consiste en poner en práctica los conceptos de cómputo concurrente vistos en clase. Se utilizarán procesos por medio del módulo `multiprocessing` del lenguaje de programación Python.

# + [markdown] id="Bl-5iBIj7vqO"
# ## Programa 1

# + [markdown] id="9WdTV3R32cRb"
# 1. Realiza el **Programa1** que instancie, como clase o con el método `Process`, 10 procesos. Cada uno de los procesos hijos recibirán un valor entero, y un caracter $(i,c)$ enviados por el proceso padre, los procesos escribirán en la salida estándar $i$ veces el caracter $c$.

# + id="ApuSZo876lqd"
def imprimir_mensaje(i, c):
    for _ in range(i):
        stdout.write(c)


# + colab={"base_uri": "https://localhost:8080/"} id="xmbH7_fw7Ik8" outputId="eabfc7d9-abe5-4ee2-deca-9cf0e5e0c130"
num_procesos = 10
for i in range(num_procesos):
    c = ascii_uppercase[i]
    it = random.randint(3, 6)
    proceso = mp.Process(target=imprimir_mensaje, args=(it, c))
    proceso.start()

# + [markdown] id="R4Kw4LBE7zb4"
# ## Programa 2

# + [markdown] id="3UYjogKy2rot"
# 2. Refactoriza (reescribe) el programa anterior y elabora el **Programa2** que incluya un mecanismo de sincronización el cual permita escribir en orden todos los caracteres de cada proceso. Es decir, que se obtenga la secuencia $c_{1,1},\ldots,c_{i,1},c_{2,1},\ldots,c_{2,i},\ldots,c_{10,1},\ldots,c_{10,i}$, donde cada subsecuencia $c_{k,i}$ para cada $k=1,2,\ldots,10$ es la secuencia de caracteres del proceso hijo $k$ con longitud $i$.

# + id="0RywVeBI95-s"
mutex = mp.Lock()


# + id="W92sZPrZ7yxK"
def imprimir_mensaje(i, c):
    mutex.acquire()
    for _ in range(i):
        stdout.write(c)
    mutex.release()


# + colab={"base_uri": "https://localhost:8080/"} id="tlR5CNJN7T2g" outputId="c8be21bb-0326-4884-e493-b1b186e2604f"
num_procesos = 10
for i in range(num_procesos):
    c = ascii_uppercase[i]
    it = random.randint(3, 6)
    proceso = mp.Process(target=imprimir_mensaje, args=(it, c))
    proceso.start()


# + [markdown] id="y-IvLmbp_DgI"
# ## Programa 3

# + [markdown] id="bl8NPOIT3Teg"
# Refactoriza (reescribe) el Programa2 y elabora el **Programa3** donde construyas un mecanismo de sincronización el cual permita escribir en orden todos los caracteres de cada proceso siguiendo una política de orden $p$ que será una lista de números enteros aleatorios con los índices $k$ de cada proceso hijo. La esccritura de los caracteres seguirá la secuencia de $c_{k,i}(p)$ donde cada secuencia $c_{k,i}$ estará definida por la política $p$.

# + id="wJYEUA7ayL3s"
def imprimir_mensaje(i, c, turno):
    turn = q.get()
    while True:
        mutex.acquire()
        if (turno.value == turn): # Si es el turno adecuado
            stdout.write("El turno de " +  str(c) + " es " + str(turn) + ". Se imprimirá " + str(i) + " veces\n")
            for _ in range(i):
                stdout.write(c)
            stdout.write("\n")
            turno.value = turno.value + 1
            mutex.release()
            break
        mutex.release()


# + colab={"base_uri": "https://localhost:8080/"} id="LLaGJmwT3vu1" outputId="e8cab3a4-4971-477a-c256-029738923863"
mutex = mp.Lock()

# Politica de orden
p = list(range(10))
random.shuffle(p)
print('La politica de orden es: ', p)

q = mp.Queue()
for num in p:
    q.put(num)

num_procesos = 10
turno = mp.Value('i', 0) # Definimos un valor entero para llevar los turnos
procesos = [None]*num_procesos

for i in range(num_procesos):
    c = ascii_uppercase[i]
    it = random.randint(3, 6)
    proceso = mp.Process(target=imprimir_mensaje, args=(it, c, turno))
    procesos[i] = proceso

for p in procesos:
    p.start()

# + id="hriWpLWe4HMf"


StarcoderdataJupyterScriptsDedupFiltered