Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python websockets错误处理:线程数量不断增加_Python_Python 3.x_Websocket_Python Asyncio - Fatal编程技术网

Python websockets错误处理:线程数量不断增加

Python websockets错误处理:线程数量不断增加,python,python-3.x,websocket,python-asyncio,Python,Python 3.x,Websocket,Python Asyncio,我有一个非常简单的MWE-两个WS连接,其中一个会抛出错误。两者都作为任务执行,并且应各自恢复。不幸的是,我的实现导致线程数量不断增加(每个错误一个)。我做错了什么 import websockets import asyncio import json uri = "wss://echo.websocket.org" async def ws(error): while True: try: async with websockets.conne

我有一个非常简单的MWE-两个WS连接,其中一个会抛出错误。两者都作为任务执行,并且应各自恢复。不幸的是,我的实现导致线程数量不断增加(每个错误一个)。我做错了什么

import websockets
import asyncio
import json
uri = "wss://echo.websocket.org"
async def ws(error):
    while True:
        try:
            async with websockets.connect(uri=uri) as websocket:
                await websocket.send("foo")
                async for message in websocket:
                    if error:
                        raise ValueError
                    print(message)
        except:
            print('caught a WS exception - going to sleep for 30 seconds')
            websocket.close()
            await asyncio.sleep(30)


async def main():
    # try:
    ws_task_error = loop.create_task(ws(error=True))
    ws_task_fine = loop.create_task(ws(False))
    await asyncio.wait([ws_task_error, ws_task_fine], return_when=asyncio.FIRST_EXCEPTION)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
我的理解是,只要我离开websockets.connect()的上下文管理器,负责的线程就应该被删除。我在这里显然没有正确地实现它。想法

-----编辑------

我觉得上面的是WE,但不是真正的M。这个例子在连接之后立即强制执行异常。在日志中,连接会正确关闭。尽管如此,我最终还是在每个连接上创建了一个新线程

import websockets
import asyncio
import logging
uri = "wss://echo.websocket.org"

logging.basicConfig(format='%(asctime)s %(levelname)s %(name)s: %(message)s')
logger = logging.getLogger('websockets')
logger.setLevel(logging.DEBUG)

async def ws():
    while True:
        async with websockets.connect(uri=uri) as websocket:
            try:
                raise ValueError
            except:
                print('Exception thrown')
            print('Exiting...')

async def main():
    ws_task_error = loop.create_task(ws())
    await asyncio.wait([ws_task_error], return_when=asyncio.FIRST_EXCEPTION)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
输出:

2020-01-21 10:44:04,710 DEBUG websockets.protocol: client - state = CONNECTING
2020-01-21 10:44:04,908 DEBUG websockets.protocol: client - event = connection_made(<asyncio.sslproto._SSLProtocolTransport object at 0x00000210389E6828>)
2020-01-21 10:44:05,001 DEBUG websockets.protocol: client - state = OPEN
Exception thrown
Exiting...
2020-01-21 10:44:05,003 DEBUG websockets.protocol: client - state = CLOSING
2020-01-21 10:44:05,003 DEBUG websockets.protocol: client > Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
2020-01-21 10:44:05,098 DEBUG websockets.protocol: client < Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
2020-01-21 10:44:05,099 DEBUG websockets.protocol: client - event = connection_lost(None)
2020-01-21 10:44:05,100 DEBUG websockets.protocol: client - state = CLOSED
2020-01-21 10:44:05,100 DEBUG websockets.protocol: client x code = 1000, reason = [no reason]
2020-01-21 10:44:05,100 DEBUG websockets.protocol: client x closing TCP connection
2020-01-21 10:44:05,193 DEBUG websockets.protocol: client - state = CONNECTING
2020-01-21 10:44:05,393 DEBUG websockets.protocol: client - event = connection_made(<asyncio.sslproto._SSLProtocolTransport object at 0x0000021038AB2908>)
2020-01-21 10:44:05,482 DEBUG websockets.protocol: client - state = OPEN
Exception thrown
Exiting...
2020-01-21 10:44:05,489 DEBUG websockets.protocol: client - state = CLOSING
2020-01-21 10:44:05,489 DEBUG websockets.protocol: client > Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
2020-01-21 10:44:05,580 DEBUG websockets.protocol: client < Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
2020-01-21 10:44:05,581 DEBUG websockets.protocol: client - event = connection_lost(None)
2020-01-21 10:44:05,582 DEBUG websockets.protocol: client - state = CLOSED
2020-01-21 10:44:05,582 DEBUG websockets.protocol: client x code = 1000, reason = [no reason]
2020-01-21 10:44:05,583 DEBUG websockets.protocol: client x closing TCP connection
2020-01-21 10:44:05,670 DEBUG websockets.protocol: client - state = CONNECTING
2020-01-21 10:44:05,863 DEBUG websockets.protocol: client - event = connection_made(<asyncio.sslproto._SSLProtocolTransport object at 0x0000021038AB2B70>)
2020-01-21 10:44:05,950 DEBUG websockets.protocol: client - state = OPEN
Exception thrown
Exiting...
2020-01-21 10:44:05,953 DEBUG websockets.protocol: client - state = CLOSING
2020-01-21 10:44:05,953 DEBUG websockets.protocol: client > Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
2020-01-21 10:44:06,036 DEBUG websockets.protocol: client < Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
2020-01-21 10:44:06,037 DEBUG websockets.protocol: client - event = connection_lost(None)
2020-01-21 10:44:06,037 DEBUG websockets.protocol: client - state = CLOSED
2020-01-21 10:44:06,038 DEBUG websockets.protocol: client x code = 1000, reason = [no reason]
2020-01-21 10:44:06,039 DEBUG websockets.protocol: client x closing TCP connection
2020-01-21 10:44:06,124 DEBUG websockets.protocol: client - state = CONNECTING
2020-01-21 10:44:06,308 DEBUG websockets.protocol: client - event = connection_made(<asyncio.sslproto._SSLProtocolTransport object at 0x0000021038AC6C50>)
2020-01-21 10:44:06,400 DEBUG websockets.protocol: client - state = OPEN
Exception thrown
Exiting...
2020-01-21 10:44:06,402 DEBUG websockets.protocol: client - state = CLOSING
2020-01-21 10:44:06,402 DEBUG websockets.protocol: client > Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
2020-01-21 10:44:06,495 DEBUG websockets.protocol: client < Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
2020-01-21 10:44:06,496 DEBUG websockets.protocol: client - event = connection_lost(None)
2020-01-21 10:44:06,496 DEBUG websockets.protocol: client - state = CLOSED
2020-01-21 10:44:06,496 DEBUG websockets.protocol: client x code = 1000, reason = [no reason]
2020-01-21 10:44:06,497 DEBUG websockets.protocol: client x closing TCP connection
2020-01-21 10:44:06,600 DEBUG websockets.protocol: client - state = CONNECTING
2020-01-21 10:44:06,827 DEBUG websockets.protocol: client - event = connection_made(<asyncio.sslproto._SSLProtocolTransport object at 0x0000021038AC6B70>)
2020-01-21 10:44:06,934 DEBUG websockets.protocol: client - state = OPEN
Exception thrown
Exiting...
2020-01-21 10:44:06,936 DEBUG websockets.protocol: client - state = CLOSING
2020-01-21 10:44:06,936 DEBUG websockets.protocol: client > Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
2020-01-21 10:44:07,042 DEBUG websockets.protocol: client < Frame(fin=True, opcode=8, data=b'\x03\xe8', rsv1=False, rsv2=False, rsv3=False)
2020-01-21 10:44:07,043 DEBUG websockets.protocol: client - event = connection_lost(None)
2020-01-21 10:44:07,044 DEBUG websockets.protocol: client - state = CLOSED
2020-01-21 10:44:07,044 DEBUG websockets.protocol: client x code = 1000, reason = [no reason]
2020-01-21 10:44:07,045 DEBUG websockets.protocol: client x closing TCP connection
2020-01-21 10:44:04710调试WebSocket.protocol:客户端-状态=正在连接
2020-01-21 10:44:04908调试websockets.protocol:client-event=connection_make()
2020-01-21 10:44:05001调试websockets.protocol:客户端-状态=打开
抛出异常
退出。。。
2020-01-21 10:44:05003调试websockets.protocol:客户端-状态=关闭
2020-01-21 10:44:05003调试WebSocket.protocol:客户端>帧(fin=True,操作码=8,数据=b'\x03\xe8',rsv1=False,rsv2=False,rsv3=False)
2020-01-21 10:44:05098调试WebSocket.protocol:客户端<帧(fin=True,操作码=8,数据=b'\x03\xe8',rsv1=False,rsv2=False,rsv3=False)
2020-01-21 10:44:05099调试websockets.protocol:客户端-事件=连接丢失(无)
2020-01-21 10:44:05100调试websockets.protocol:客户端-状态=关闭
2020-01-21 10:44:05100调试websockets.protocol:客户端x代码=1000,原因=[无原因]
2020-01-21 10:44:05100调试websockets.protocol:客户端x关闭TCP连接
2020-01-21 10:44:05193调试WebSocket.protocol:客户端-状态=正在连接
2020-01-21 10:44:05393调试websockets.protocol:客户端-事件=连接
2020-01-21 10:44:05482调试websockets.protocol:客户端-状态=打开
抛出异常
退出。。。
2020-01-21 10:44:05489调试websockets.protocol:客户端-状态=关闭
2020-01-21 10:44:05489调试WebSocket.protocol:客户端>帧(fin=True,操作码=8,数据=b'\x03\xe8',rsv1=False,rsv2=False,rsv3=False)
2020-01-21 10:44:05580调试WebSocket.protocol:客户端<帧(fin=True,操作码=8,数据=b'\x03\xe8',rsv1=False,rsv2=False,rsv3=False)
2020-01-21 10:44:05581调试websockets.protocol:客户端-事件=连接丢失(无)
2020-01-21 10:44:05582调试websockets.protocol:客户端-状态=关闭
2020-01-21 10:44:05582调试websockets.protocol:客户端x代码=1000,原因=[无原因]
2020-01-21 10:44:05583调试websockets.protocol:客户端x关闭TCP连接
2020-01-21 10:44:05670调试WebSocket.protocol:客户端-状态=正在连接
2020-01-21 10:44:05863调试websockets.protocol:client-event=connection_make()
2020-01-21 10:44:05950调试websockets.protocol:客户端-状态=打开
抛出异常
退出。。。
2020-01-21 10:44:05953调试WebSocket.protocol:客户端-状态=关闭
2020-01-21 10:44:05953调试WebSocket.protocol:客户端>帧(fin=True,操作码=8,数据=b'\x03\xe8',rsv1=False,rsv2=False,rsv3=False)
2020-01-21 10:44:06036调试WebSocket.protocol:客户端<帧(fin=True,操作码=8,数据=b'\x03\xe8',rsv1=False,rsv2=False,rsv3=False)
2020-01-21 10:44:06037调试websockets.protocol:客户端-事件=连接丢失(无)
2020-01-21 10:44:06037调试websockets.protocol:客户端-状态=关闭
2020-01-21 10:44:06038调试websockets.protocol:客户端x代码=1000,原因=[无原因]
2020-01-21 10:44:06039调试websockets.protocol:客户端x关闭TCP连接
2020-01-21 10:44:06124调试websockets.protocol:客户端-状态=正在连接
2020-01-21 10:44:06308调试websockets.protocol:client-event=connection_make()
2020-01-21 10:44:06400调试WebSocket.protocol:客户端-状态=打开
抛出异常
退出。。。
2020-01-21 10:44:06402调试websockets.protocol:客户端-状态=关闭
2020-01-21 10:44:06402调试WebSocket.protocol:客户端>帧(fin=True,操作码=8,数据=b'\x03\xe8',rsv1=False,rsv2=False,rsv3=False)
2020-01-21 10:44:06495调试WebSocket.protocol:客户端<帧(fin=True,操作码=8,数据=b'\x03\xe8',rsv1=False,rsv2=False,rsv3=False)
2020-01-21 10:44:06496调试WebSocket.protocol:客户端-事件=连接丢失(无)
2020-01-21 10:44:06496调试WebSocket.protocol:客户端-状态=关闭
2020-01-21 10:44:06496调试websockets.protocol:客户端x代码=1000,原因=[无原因]
2020-01-21 10:44:06497调试websockets.protocol:客户端x关闭TCP连接
2020-01-21 10:44:06600调试websockets.protocol:客户端-状态=正在连接
2020-01-21 10:44:06827调试websockets.protocol:client-event=connection_make()
2020-01-21 10:44:06934调试WebSocket.protocol:客户端-状态=打开
抛出异常
退出。。。
2020-01-21 10:44:06936调试WebSocket.protocol:客户端-状态=关闭
2020-01-21 10:44:06936调试WebSocket.protocol:客户端>帧(fin=True,操作码=8,数据=b'\x03\xe8',rsv1=False,rsv2=False,rsv3=False)
2020-01-21 10:44:07042调试WebSocket.protocol:客户端<帧(fin=True,操作码=8,数据=b'\x03\xe8',rsv1=False,rsv2=False,rsv3=False)
2020-01-21 10:44:07043调试WebSocket.protocol:客户端-事件=连接丢失(无)
2020-01-21 10:44:07044调试websockets.protocol:客户端-状态=关闭
2020-01-21 10:44:07044调试websockets.protocol:客户端x代码=1000,原因=[无原因]
2020-01-21 10:44:07045调试WebSocket.protocol:客户端x关闭TCP连接

为True时:
应位于与websocket异步的
下。连接(uri=uri)为websocket:

事实上,在您的示例中,
ws\u task\u fine
任务在第一条消息之后锁定websocket:中消息的
async。以及
ws\u task\u error
task循环,乘以线程

下面是一个如何实施的粗略示例:<
import websockets
import asyncio

uri = "wss://echo.websocket.org"


async def ws(error):
    async with websockets.connect(uri=uri) as websocket:
        while True:
            print('Starting...' + str(error))
            try:
                await websocket.send("foo")
                message = await websocket.recv()
                print(message)
                if error:
                    raise ValueError('Exception')
            except Exception as e:
                print(e)
            print('Finishing...' + str(error))
            await asyncio.sleep(2)


async def main():
    # try:
    ws_task_error = loop.create_task(ws(error=True))
    # ws_task_fine = loop.create_task(ws(False))
    await asyncio.wait([ws_task_error])

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.run_forever()
Starting...True
foo
Exception
Finishing...True
Starting...True
foo
Exception
Finishing...True
Starting...True
foo
Exception
Finishing...True