Dec-23-2017, 10:24 PM
i have the following code:
import asyncio import functools class EchoClientProtocol(asyncio.Protocol): def __init__(self, message, future): self.message = message self.f = future def connection_made(self, transport): self.transport = transport transport.write(self.message.encode()) print('Data sent: {!r}'.format(self.message)) def data_received(self, data): print('Data received: {}'.format(data.decode('utf-8'))) self.transport.close() self.f.set_result(True) def connection_lost(self, exc): print('Connection lost') loop = asyncio.get_event_loop() message = "hello" connectionsTasks = [] dataReceivedTasks = [] for i in range(5): dataReceivedFuture = asyncio.Future() connectionFuture = loop.create_connection(lambda: EchoClientProtocol(message, dataReceivedFuture), '127.0.0.1', 2222) connectionsTasks.append(connectionFuture) dataReceivedTasks.append(dataReceivedFuture) connectionFutures = asyncio.gather(*connectionsTasks) dataReceivedFutures = asyncio.gather(*dataReceivedTasks) loop.run_until_complete(connectionFutures) loop.run_until_complete(dataReceivedFutures) loop.close()What i want is create concurrently 5 connections as client, send data, get responses and when all of them have arrived exit the asyncio loop. In the loop creating the connections i create new futures that i pass as argument and set when i have received back data. Then store them in a list and through the gather() function i create a future that is set when all of them are set. But when i run the code and get the second response i get a "asyncio.base_futures.InvalidStateError: invalid state" error on line 17 (self.f.set_result(True)) which tells me actually that i have already set the future. Shouldn't it be a diffrent future than the previous? How can i achieve the result i'm trying?