• # Solution

    Posté par . En réponse au message Multiprocessing. Évalué à 2. Dernière modification le 24 décembre 2016 à 18:35.

    Encore merci benja !

    Est-ce qu’il est correct de dire qu’en faisant [Pool(N)] * M je fais en fait M références au même objet ?

    Quoi qu’il en soit voici la solution en utilisant plusieurs dortoirs. Maintenant les nourrissons peuvent tous commencer leur sieste en même temps et le temps total est égal au temps de la plus longue sieste.

    Il fallait faire comme ça pour avoir plusieurs pools:

    barracks = []
    for i in range(0, int(nurserySize/dormitorySize) + 1):
     barracks.append(Pool(dormitorySize))

    Le script en entier (j’ai viré la méthode 1.) :

    #!/usr/bin/env python3
    """Make all the toddlers in the nursery have their nap."""
    from multiprocessing import Pool
    from random import randint, sample
    from time import sleep, time
    import string
    from pprint import pprint
    """What a toddler does when he’s having his nap."""
    def nap(toddler):
     time = randint(0,4)
     print(toddler+' Zzz...', end=' ', flush=True)
     sleep(time)
     return(toddler, time)
    """Populate the nursery with toddlers."""
    nurserySize = 11
    toddlers = []
    while (len(toddlers) < nurserySize):
     # Every toddler has a name
     toddlers.append(''.join(sample(string.ascii_lowercase,randint(3,7))).capitalize())
    """For all toddlers, make them nap grouped in available dormitories.
    The nap is finished for all the toddlers in a dormitory when the last one wakes up."""
    dormitorySize = 4
    """Nap all the toddlers at once."""
    start = time()
    barracks = []
    for i in range(0, int(nurserySize/dormitorySize) + 1):
     barracks.append(Pool(dormitorySize))
    sleepAmount = 0
    dormitories = []
    j = 0
    # The callback function will be called when the pool has finished.
    def fillDormitory(toddlers):
     dormitories.append(toddlers)
    print(str(len(toddlers))+' toddlers going to sleep '+str(dormitorySize)+' by '+str(dormitorySize)+' in '+str(len(barracks))+' dormitories.')
    for i in range(0, nurserySize, dormitorySize):
     barracks[j].map_async(nap, toddlers[i:i+dormitorySize], callback=fillDormitory)
     j += 1
    for b in barracks:
     b.close()
     b.join()
    # Count total sleep amount.
    for dormitory in dormitories:
     for toddler in dormitory:
     sleepAmount += toddler[1]
    print(dormitories)
    _time = time() - start
    _ratio = sleepAmount/_time
    print("\n",' → Tooks '+str(_time)+' seconds for '+str(sleepAmount)+' of sleep. ('+str(_ratio)+')',"\n")

    EDIT: J’ai le sentiment que je devrais pouvoir me passer d’utiliser un indice explicite (j), ça ne doit pas être très pythonesque comme manière de faire :/