我是Python的新手,我对asyncio并不了解。我想运行此脚本,如果尝试连接到10.11.0.124的OBS软件未运行以退出代码。该代码可以执行此操作,但是退出之前需要2分钟。我无法弄清楚为什么当它无法连接到未在10.11.0.124上运行的OBS软件时不能立即退出。

#! /usr/bin/python3

import asyncio
import urllib.request
import sys
import datetime

from obswsrc import OBSWS
from obswsrc.requests import StartStopStreamingRequest

def logger(logmessage):
    f = open("log.txt", "a")
    f.write(str(datetime.datetime.now()) + " " + logmessage + "\n")
    f.close

async def main():

   try:
        async with OBSWS('10.11.0.124', 4444, "password") as obsws:

            logger("Connection established.")

            while True:

                event = await obsws.event()

                logger(str(format(event.type_name)))

                if(format(event.type_name) == "StreamStarting"):
                    HitURLToLoadAsset = urllib.request.urlopen("http://10.11.0.159/api/v1/assets/control/asset&b0983c0918b94856900040d9a9e8bdbf").read()
                    logger(str(HitURLToLoadAsset))

                if(format(event.type_name) == "StreamStopped"):
                    HitURLToLoadAsset = urllib.request.urlopen("http://10.11.0.159/api/v1/assets/control/asset&3b2fb67002364b269d0c2674a628533c").read()
                    logger(str(HitURLToLoadAsset))

            logger("Connection terminated.")

    except OSError:
        logger("OBS IS NOT RUNNING")

    except:
        logger(str(sys.exc_info()[1]))


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

最佳答案

OBSWS函数有两分钟的超时,因为它在内部使用websockets模块,并且默认超时为两分钟。

详细明细:


async with OBSWS(...):调用OBSWS.__init__,然后调用awaitOBSWS.__aenter__
OBSWS.__init__没什么有趣的,但是OBSWS.__aenter__ awaits OBSWS.connect
OBSWS.connect awaits websocket.connect
websockets.connect通过关键字参数定义了几个不同的超时。它还等待着很多事情。这些是:


self._creating_connectiondefined here


它使用loop.create_connection,默认情况下超时时间为60秒。
然后,它调用factory,该defaults to create_protocol调用klass哪个defaults to哪个WebSocketClientProtocol WebSocketCommonProtocol,这是protocol.handshake(...)的子类,这可能不会增加任何进一步的延迟。

protocol.fail_connection()
在引发任何异常的情况下,确实会发生。



我不理解asyncio,所以我就在这里停下来。某处可能还会有60秒的延迟,但如果没有,则可能是计算机运行缓慢。

10-06 14:01