def drinking_with_friend(friends_list):
try:
data = friends_list.pop(0)
except IndexError:
print('There are no more sober friends')
return False
interval = random.random() * 10
print('Start Drinking with {:>20} time for drinking (duration {} )'.format(data, interval))
time.sleep(interval)
print('Finish Drinking with {:>19} time for drinking (duration {} )'.format(data, interval))
Start Drinking with Vasya time for drinking (duration 0.525207635674314 )
Start Drinking with Petya time for drinking (duration 8.101208126205927 )
Start Drinking with Kolya time for drinking (duration 5.656888553205503 )
Start Drinking with Sasha time for drinking (duration 9.985692547228792 )
Finish Drinking with Vasya time for drinking (duration 0.525207635674314 )
Start Drinking with Ivan time for drinking (duration 6.944745503696382 )
Finish Drinking with Kolya time for drinking (duration 5.656888553205503 )
Start Drinking with Alex time for drinking (duration 8.269980798554679 )
Finish Drinking with Ivan time for drinking (duration 6.944745503696382 )
Start Drinking with Semen time for drinking (duration 7.068649522212147 )
Finish Drinking with Petya time for drinking (duration 8.101208126205927 )
Start Drinking with Goga Aka Gosha time for drinking (duration 5.178367620321175 )
Finish Drinking with Sasha time for drinking (duration 9.985692547228792 )
There are no more sober friends
There are no more sober friends
Finish Drinking with Goga Aka Gosha time for drinking (duration 5.178367620321175 )
Finish Drinking with Alex time for drinking (duration 8.269980798554679 )
Finish Drinking with Semen time for drinking (duration 7.068649522212147 )
pop()
получат IndexError
и умрут, ну лучше так не делает и обрабатывать исключение и нормально завершать процесс. def rotator(used):
index = random.randint(0,len(my_list)-1)
while my_list[index] in used:
index = random.randint(0,len(my_list)-1)
used
оно отсутствует, и когда все эти 4 процесса уже взяли какое-то значение только после этого оно добавляется в used
. Я показал вам пример как производить ротацию, что бы гарантировать то, что 2 процесса не будут обращаться к одному и тому-же объекту, нужно что бы этого объекта просто не было в списке. Вы можете играться с Lock, но тогда конкретно в вашем случае поток выполнения будет блокироваться пока 1 процесс не закончит операцию и только затем начнет обрабатывать следующий процесс. Абсурд, т.к. по сути вы превратите многопроцессорный-параллельный скрипт в многопроцессорный-последовательный. pop()
. Если элемента не будет в списке, то и взять его процесс не сможет =)pop()
, то будет ошибка IndexError
.