Posté par Marotte ⛧ .
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:
#!/usr/bin/env python3"""Make all the toddlers in the nursery have their nap."""frommultiprocessingimportPoolfromrandomimportrandint,samplefromtimeimportsleep,timeimportstringfrompprintimportpprint"""What a toddler does when he’s having his nap."""defnap(toddler):time=randint(0,4)print(toddler+' Zzz...',end=' ',flush=True)sleep(time)return(toddler,time)"""Populate the nursery with toddlers."""nurserySize=11toddlers=[]while(len(toddlers)<nurserySize):# Every toddler has a nametoddlers.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=[]foriinrange(0,int(nurserySize/dormitorySize)+1):barracks.append(Pool(dormitorySize))sleepAmount=0dormitories=[]j=0# The callback function will be called when the pool has finished.deffillDormitory(toddlers):dormitories.append(toddlers)print(str(len(toddlers))+' toddlers going to sleep '+str(dormitorySize)+' by '+str(dormitorySize)+' in '+str(len(barracks))+' dormitories.')foriinrange(0,nurserySize,dormitorySize):barracks[j].map_async(nap,toddlers[i:i+dormitorySize],callback=fillDormitory)j+=1forbinbarracks:b.close()b.join()# Count total sleep amount.fordormitoryindormitories:fortoddlerindormitory:sleepAmount+=toddler[1]print(dormitories)_time=time()-start_ratio=sleepAmount/_timeprint("\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 :/
# Solution
Posté par Marotte ⛧ . 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)] * Mje 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:
Le script en entier (j’ai viré la méthode 1.) :
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 :/