我是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__
,然后调用await
的OBSWS.__aenter__
。OBSWS.__init__
没什么有趣的,但是OBSWS.__aenter__
await
s OBSWS.connect
OBSWS.connect
await
s websocket.connect
。websockets.connect
通过关键字参数定义了几个不同的超时。它还等待着很多事情。这些是:self._creating_connection
,defined here
它使用loop.create_connection
,默认情况下超时时间为60秒。
然后,它调用factory
,该defaults to create_protocol
调用klass
哪个defaults to哪个WebSocketClientProtocol
WebSocketCommonProtocol
,这是protocol.handshake(...)
的子类,这可能不会增加任何进一步的延迟。protocol.fail_connection()
在引发任何异常的情况下,确实会发生。
我不理解asyncio
,所以我就在这里停下来。某处可能还会有60秒的延迟,但如果没有,则可能是计算机运行缓慢。