袩芯蟹薪邪泻芯屑懈褌褜褋褟 褋 邪褋懈薪褏褉芯薪薪褘屑 胁褘锌芯谢薪械薪懈械屑 锌褉芯褑械写褍褉 胁 Python 锌褉懈 锌芯屑芯褖懈 asyncio
袪械邪谢懈蟹褍泄褌械 锌褉芯褋褌械泄褕懈泄 褝褏芯 褋械褉胁械褉 懈褋锌芯谢褜蟹褍褟 屑芯写褍谢褜 邪褋懈薪褏褉芯薪薪芯谐芯 锌褉芯谐褉邪屑屑懈褉芯胁邪薪懈褟.
袙 写邪薪薪芯泄 褉邪斜芯褌褘 屑褘 锌芯蟹薪邪泻芯屑懈屑褋褟 褋 胁芯蟹屑芯卸薪芯褋褌褟屑懈 芯谐褉邪薪懈蟹邪褑懈懈 TCP-褋械褉胁械褉邪 锌褉懈 锌芯屑芯褖懈 asyncio 胁 Python 3.6+
袛邪薪薪褘泄 屑芯写褍谢褜 懈屑械械褌 芯锌褉械写械谢械薪薪褘械 锌褉械懈屑褍褖械褋褌胁邪 锌械褉械写 褋褉械写褋褌胁邪屑懈 芯褉谐邪薪懈蟹邪褑懈懈 屑薪芯谐芯锌芯褌芯褔薪芯褋褌懈, 邪 懈屑械薪薪芯:
- 褉械邪谢懈蟹邪褑懈褟 泻芯芯锌械褉邪褌懈胁薪芯泄 屑薪芯谐芯蟹邪写邪褔薪芯褋褌懈;
- 锌褉芯褋褌芯褌邪 薪邪锌懈褋邪薪懈褟 泻芯写邪 懈 芯褌谢邪写泻懈 胁褘锌芯谢薪械薪懈褟 锌褉芯谐褉邪屑屑褘;
- 锌褉芯褋褌芯褌邪 芯斜械褋锌械褔械薪懈褟 斜械蟹芯锌邪褋薪芯褋褌懈 胁褘锌芯谢薪械薪懈褟 泻芯写邪.
袦芯写褍谢褜 asyncio 写邪卸械 懈屑械械褌 薪械泻芯褌芯褉褘械 胁褋褌褉芯械薪薪褘械 褋褉械写褋褌胁邪 写谢褟 芯褉谐邪薪懈蟹邪褑懈懈 褋械褉胁械褉邪 懈 泻谢懈械薪褌邪. 袣邪泻 胁褘 蟹薪邪械褌械, 锌褉懈 薪邪锌懈褋邪薪懈懈 邪褋懈薪褏褉芯薪薪褘褏 锌褉芯谐褉邪屑屑 薪械谢褜蟹褟 懈褋锌芯谢褜蟹芯胁邪褌褜 褋褌邪薪写邪褉褌薪褘械 斜谢芯泻懈褉褍褞褖懈械 芯锌械褉邪褑懈懈, 褌邪泻懈械 泻邪泻 socket.recv(). 袧褍卸薪芯 谢懈斜芯 芯斜芯褉邪褔懈胁邪褌褜 懈褏 胁 褋锌械褑懈邪谢褜薪褘泄 芯斜褉邪斜芯褌褔懈泻, 谢懈斜芯 懈褋锌芯谢褜蟹芯胁邪褌褜 芯褋芯斜褘械, 邪褋懈薪褏褉芯薪薪褘械 胁械褉褋懈懈 褌邪泻懈褏 芯锌械褉邪褌芯褉芯胁. 袣 褋褔邪褋褌褜褞, 胁 屑芯写褍谢械 asyncio 锌褉懈褋褍褌褋褌胁褍械褌 褋锌械褑懈邪谢褜薪褘泄 褋懈薪褌邪泻褋懈褋 写谢褟 芯褉谐邪薪懈蟹邪褑懈 锌芯褋褌芯褟薪薪芯 写械泄褋褌胁褍褞褖械谐芯 褋械褉胁械褉邪, 懈薪泻邪锌褋褍谢懈褉褍褞褖懈泄 胁褋褞 褋谢褍卸械斜薪褍褞 褉邪斜芯褌褍 锌芯 芯褉谐邪薪懈蟹邪褑懈懈 锌芯褌芯泻邪 褋芯斜褘褌懈泄.
袛谢褟 薪邪褔邪谢邪, 写邪胁邪泄褌械 薪邪锌懈褕械屑 泻谢懈械薪褌褋泻褍褞 褔邪褋褌褜, 褌邪泻 泻邪泻 芯薪邪 谐芯褉邪蟹写芯 锌褉芯褖械. 袧邪屑 薪褍卸薪芯 胁褋褞 谢芯谐懈泻褍 褉邪斜芯褌褘 泻谢懈械薪褌邪, 芯褌 芯褌泻褉褘褌懈褟 写芯 蟹邪泻褉褘褌懈褟 褋芯械写懈薪械薪懈褟, 胁褘写械谢懈褌褜 胁 褎褍薪泻褑懈褞 (邪褋懈薪褏褉芯薪薪褍褞 泻芯褉褍褌懈薪褍):
async def tcp_echo_client(host, port):
reader, writer = await asyncio.open_connection(host, port)
message = 'Hello, world'
writer.write(message.encode())
await writer.drain()
data = await reader.read(100)
writer.close()
await writer.wait_closed()袨斜褉邪褌懈褌械 胁薪懈屑邪薪懈械 薪邪 褎褍薪泻褑懈褞 asyncio.open_connection. 袨薪邪 胁芯蟹胁褉邪褖邪械褌 写胁邪 芯斜褗械泻褌邪, 泻芯褌芯褉褘械 懈 懈褋锌芯谢褜蟹褍褞褌褋褟 写谢褟 芯斜屑械薪邪 褋芯芯斜褖械薪懈褟屑懈 胁 邪褋懈薪褏褉芯薪薪芯屑 褉械卸懈屑械. 袛谢褟 褌芯谐芯, 褔褌芯斜褘 蟹邪锌褍褋褌懈褌褜 褝褌褍 褎褍薪泻褑懈褞, 薪邪屑 薪褍卸薪芯 褋芯蟹写邪褌褜 褑懈泻谢 褋芯斜褘褌懈泄, 褋芯蟹写邪褌褜 蟹邪写邪褔褍 懈 蟹邪锌褍褋褌懈褌褜 蟹邪写邪褔褍 胁 褑懈泻谢械:
loop = asyncio.get_event_loop()
task = loop.create_task(tcp_echo_client(HOST, PORT))
loop.run_until_complete(task)袝褋谢懈 胁褘 懈褋锌芯谢褜蟹褍械褌械 Python 3.7, 褌芯 胁屑械褋褌芯 褝褌芯泄 谐褉芯屑芯蟹写泻芯泄 泻芯薪褋褌褉褍泻褑懈懈 屑芯卸薪芯 薪邪锌懈褋邪褌褜 锌褉芯褋褌芯:
loop.run(tcp_echo_client(HOST, PORT))孝械锌械褉褜 锌褉懈褋褌褍锌懈屑 泻 褋芯蟹写邪薪懈褞 褋械褉胁械褉邪. 袛谢褟 褝褌芯谐芯 薪邪屑 斜褍写械褌 写芯褋褌邪褌芯褔薪芯 薪邪锌懈褋邪褌褜 谢懈褕褜 褎褍薪泻褑懈褞 芯斜褉邪斜芯褌泻懈 锌芯写泻谢褞褔械薪懈褟. 袧邪锌褉懈屑械褉, 写谢褟 褝褏芯 褋械褉胁械褉邪 芯薪邪 斜褍写械褌 胁褘谐谢褟写械褌褜 锌褉懈屑械褉薪芯 褌邪泻:
async def handle_echo(reader, writer):
data = await reader.read(100)
message = data.decode()
writer.write(data)
await writer.drain()
writer.close()袣芯写 蟹邪锌褍褋泻邪 褋械褉胁械褉邪 屑褘 褌芯卸械 薪邪锌懈褕械屑 胁 芯斜芯褋芯斜谢械薪薪芯泄 泻芯褉褍褌懈薪械, 褔褌芯斜褘 芯褌写械谢懈褌褜 械谐芯 芯褌 芯褋褌邪谢褜薪芯泄 锌褉芯谐褉邪屑屑褘:
async def main():
server = await asyncio.start_server(handle_echo, HOST, PORT)
await server.serve_forever()协褌褍 泻芯褉褍褌懈薪褍 屑芯卸薪芯 蟹邪锌褍褋褌懈褌褜 芯锌懈褋邪薪薪褘屑 胁褘褕械 褋锌芯褋芯斜芯屑, 胁泻谢褞褔懈胁 械械 胁 褋锌懈褋芯泻 蟹邪写邪褔 胁 褑懈泻谢械 褋芯斜褘褌懈泄. 袨写薪邪泻芯, 褌邪泻芯泄 褋锌芯褋芯斜 斜褍写械褌 褉邪斜芯褌邪褌褜 褌芯谢褜泻芯 胁 Python 3.7+. 袝褋谢懈 褍 胁邪褋 胁械褉褋懈褟 3.6, 褌芯 芯褉谐邪薪懈蟹芯胁邪褌褜 蟹邪锌褍褋泻 褋谢械写褍械褌 薪械屑薪芯谐芯 懈薪邪褔械:
loop = asyncio.get_event_loop()
coro = asyncio.start_server(handle_echo, '127.0.0.1', 8888, loop=loop)
server = loop.run_until_complete(coro)
try:
loop.run_forever()
except KeyboardInterrupt:
pass
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()袨斜褉邪褌懈褌械 胁薪懈屑邪薪懈械, 褔褌芯 屑械褏邪薪懈蟹屑 懈褋锌芯谢褜蟹芯胁邪薪懈褟 邪褋懈薪褏褉芯薪薪褘褏 褋械褉胁械褉芯胁 褋褍褖械褋褌胁械薪薪芯 屑械薪褟褌械褌褋褟 芯褌 胁械褉褋懈懈 泻 胁械褉褋懈懈. 袩褉懈 薪邪锌懈褋邪薪懈懈 锌褉芯屑褘褕谢械薪薪芯谐芯 泻芯写邪 薪械芯斜褏芯写懈屑芯 褍薪懈褎懈褑懈褉芯胁邪褌褜 械谐芯 写谢褟 写芯褋褌懈卸械薪懈褟 褍薪懈胁械褉褋邪谢褜薪芯褋褌懈 胁褘锌芯谢薪械薪懈褟.
袪械邪谢懈蟹褍泄褌械 胁褋械 写芯锌芯谢薪懈褌械谢褜薪褘械 蟹邪写邪薪懈褟 懈蟹 锌褉械写褘写褍褖懈褏 屑械褌芯写懈褔械泻 锌褉芯 屑薪芯谐芯锌芯褌芯褔薪褘泄 褋械褉胁械褉, 褌芯谢褜泻芯 褋 懈褋锌芯谢褜蟹芯胁邪薪懈械屑 屑芯写褍谢褟 asyncio.