ฉันจำเป็นต้องมีไคลเอนต์ websocket ที่ใช้งานมานานซึ่งได้รับข้อความพุชจากเซิร์ฟเวอร์ websocket และฉันต้องตรวจสอบสถานะการเชื่อมต่อของไคลเอนต์: หากการเชื่อมต่อหยุดทำงาน ฉันจำเป็นต้องค้นหา
วิธีการของฉันคือบันทึกสตริงคงที่เป็นระยะ และส่งสัญญาณแจ้งเตือนหากตรวจไม่พบข้อความบันทึก
ความคิดของฉัน: 1) มีไคลเอนต์ websocket ที่ตอบสนองต่อข้อความขาเข้าที่ผิดปกติ และ 2) ในเวลาเดียวกันมีการวนซ้ำที่หยุดการบันทึกข้อความเมื่อไคลเอนต์ websocket ส่งข้อยกเว้น ConnectionClosed
ฉันรู้สึกทึ่งกับไวยากรณ์ async 3.5 ใหม่ การใช้งาน websocket นี้ ขึ้นอยู่กับ asyncio โดยเฉพาะ ไคลเอนต์ในเอกสารมีลักษณะเหมือนกับที่ฉันต้องการทุกประการ
อย่างไรก็ตาม ฉันไม่รู้ว่าจะเพิ่ม coroutine ตัวที่สองที่คำสั่งการบันทึกของฉัน และ หยุดลงเมื่อการเชื่อมต่อ websocket ส่ง ConnectionClosed ได้อย่างไร
นี่คือสิ่งที่จะเริ่มต้นการสนทนาแต่ไม่ได้ผลเนื่องจากเมธอดที่มีชีวิตจะบล็อกการวนซ้ำของเหตุการณ์ สิ่งที่ฉันกำลังมองหาคือโซลูชันที่ยอดเยี่ยมในการใช้งานทั้งสองวิธีไปพร้อมๆ กัน
#!/usr/bin/env python
import asyncio
import logging
import websockets
logger = logging.getLogger(__name__)
is_alive = True
async def alive():
while is_alive:
logger.info('alive')
await asyncio.sleep(300)
async def async_processing():
async with websockets.connect('ws://localhost:8765') as websocket:
while True:
try:
message = await websocket.recv()
print(message)
except websockets.exceptions.ConnectionClosed:
print('ConnectionClosed')
is_alive = False
break
asyncio.get_event_loop().run_until_complete(alive())
asyncio.get_event_loop().run_until_complete(async_processing())