Próbuję zrobić program, aby dużo połączeń internetowych gniazd do serwera Mam Utworzono:Stopniowo tworzyć zadania async i czekać na wszystkie z nich, aby zakończyć
class WebSocketClient():
@asyncio.coroutine
def run(self):
print(self.client_id, 'Connecting')
ws = yield from aiohttp.ws_connect(self.url)
print(self.client_id, 'Connected')
print(self.client_id, 'Sending the message')
ws.send_str(self.make_new_message())
while not ws.closed:
msg = yield from ws.receive()
if msg.tp == aiohttp.MsgType.text:
print(self.client_id, 'Received the echo')
yield from ws.close()
break
print(self.client_id, 'Closed')
@asyncio.coroutine
def make_clients():
for client_id in range(args.clients):
yield from WebSocketClient(client_id, WS_CHANNEL_URL.format(client_id=client_id)).run()
event_loop.run_until_complete(make_clients())
Problem polega na tym, że wszyscy klienci wykonywać swoją pracę jeden po drugim:
0 Connecting
0 Connected
0 Sending the message
0 Received the echo
0 Closed
1 Connecting
1 Connected
1 Sending the message
1 Received the echo
1 Closed
...
Próbowałem użyć asyncio.wait
, ale wszyscy klienci zaczynają razem. Chcę, aby były tworzone stopniowo i połączone z serwerem natychmiast po utworzeniu każdego z nich. W tym samym czasie kontynuując tworzenie nowych klientów.
Jakie podejście należy zastosować, aby to osiągnąć?
można [użyć semafora, aby ograniczyć liczbę jednoczesnych połączeń] (http://stackoverflow.com/a/20722204/4279) – jfs
Proszę ozdobić WebSocketClient jako ' @ coroutine' –
@AndrewSvetlov tak, jest udekorowany - błąd kopiowania/wklejania – warvariuc