Nous utilisons plusieurs Threads pour accéder à une ressource,Mais parfois, il faut limiter le total.Par exemple, le pool de connexion,Prise en charge des connexions simultanées,Mais le nombre est fixe.Ces connexions peuvent être utiliséesSemaphorePour gérer.
Supposons qu'un tel scénario:
Un restaurant,Seuls un nombre déterminé de personnes peuvent manger en même temps,Ceux qui sont au - delà doivent attendre que les autres aient fini de manger avant de manger.
Exemple de code:
import logging
import random
import time
from threading import Thread, Semaphore
logging.basicConfig(level=logging.DEBUG, format='%(threadName)s-%(asctime)s-%(message)s')
class Restaurant:
def __init__(self, seat_count):
self.seat_count = seat_count # Nombre de places
def eating(self):
logging.debug("Pendant le repas...")
time.sleep(random.randint(2, 5)) # Les repas sont aléatoires2~5Secondes
logging.debug("Dîner terminé")
def eating(s: Semaphore, r: Restaurant):
with s:
r.eating()
if __name__ == '__main__':
r = Restaurant(5) # La plupart5Les gens mangent en même temps
s = Semaphore(r.seat_count) # Limiter le nombre de personnes qui mangent en même temps au nombre de places
for i in range(10): # 10 Besoin personnel de repas
t = Thread(target=eating, name=f'Clients{
i}', args=(s, r))
t.start()
Résultats:
Clients0-2022-06-27 14:45:30,778-Pendant le repas...
Clients1-2022-06-27 14:45:30,779-Pendant le repas...
Clients2-2022-06-27 14:45:30,779-Pendant le repas...
Clients3-2022-06-27 14:45:30,780-Pendant le repas...
Clients4-2022-06-27 14:45:30,780-Pendant le repas...
Clients2-2022-06-27 14:45:33,780-Dîner terminé
Clients5-2022-06-27 14:45:33,780-Pendant le repas...
Clients1-2022-06-27 14:45:34,789-Dîner terminé
Clients4-2022-06-27 14:45:34,789-Dîner terminé
Clients6-2022-06-27 14:45:34,789-Pendant le repas...
Clients7-2022-06-27 14:45:34,789-Pendant le repas...
Clients3-2022-06-27 14:45:35,786-Dîner terminé
Clients0-2022-06-27 14:45:35,786-Dîner terminé
Clients8-2022-06-27 14:45:35,787-Pendant le repas...
Clients9-2022-06-27 14:45:35,787-Pendant le repas...
Clients6-2022-06-27 14:45:37,793-Dîner terminé
Clients5-2022-06-27 14:45:38,782-Dîner terminé
Clients8-2022-06-27 14:45:39,788-Dîner terminé
Clients7-2022-06-27 14:45:39,803-Dîner terminé
Clients9-2022-06-27 14:45:40,799-Dîner terminé
Grâce aux résultats,Nous pouvons voir,Tout au plus.5 Repas individuels simultanés , Quand quelqu'un aura fini son repas , Il y aura bientôt de nouveaux clients , Répondre aux exigences de notre scénario .