歡迎您光臨本站 註冊首頁

python 使用事件對象asyncio.Event來同步協程的操作

←手機掃碼閱讀     月球人 @ 2020-05-05 , reply:0

事件對象asyncio.Event是基於threading.Event來實現的。
事件可以一個信號觸發多個協程同步工作,
例子如下:

import asyncio
import functools
import logging
import sys
MESSAGES = [b'This is the message. ', b'It will be sent ', b'in parts.', ]
SERVER_ADDRESS = ('localhost', 10000)
class EchoClient(asyncio.Protocol):
    def __init__(self, messages, future):
        super().__init__()
        self.messages = messages
        self.log = logging.getLogger('EchoClient')
        self.f = future
    def connection_made(self, transport):
        self.transport = transport
        self.address = transport.get_extra_info('peername')
        self.log.debug('connecting to {} port {}'.format(*self.address))
        # This could be transport.writelines() except that 
        # would make it harder to show each part of the message 
        # being sent. 
        for msg in self.messages: transport.write(msg)
        self.log.debug('sending {!r}'.format(msg))
        if transport.can_write_eof(): transport.write_eof()
    def data_received(self, data):
        self.log.debug('received {!r}'.format(data))
    def eof_received(self):
        self.log.debug('received EOF')
        self.transport.close()
        if not self.f.done(): self.f.set_result(True)
    def connection_lost(self, exc): 
        self.log.debug('server closed connection')
        self.transport.close()
        if not self.f.done(): self.f.set_result(True)
        super().connection_lost(exc)
        logging.basicConfig(level=logging.DEBUG, format='%(name)s: %(message)s',
                            stream=sys.stderr, )
        log = logging.getLogger('main')
        event_loop = asyncio.get_event_loop()
        client_completed = asyncio.Future()
        client_factory = functools.partial(EchoClient, messages=MESSAGES, future=client_completed, )
        factory_coroutine = event_loop.create_connection(client_factory, *SERVER_ADDRESS, )
        log.debug('waiting for client to complete')
        try: event_loop.run_until_complete(factory_coroutine)
        event_loop.run_until_complete(client_completed) finally: log.debug('closing event loop')
        event_loop.close()



[月球人 ] python 使用事件對象asyncio.Event來同步協程的操作已經有308次圍觀

http://coctec.com/docs/python/shhow-post-232922.html