我是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()
答案 0 :(得分:2)
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
,后者调用create_protocol
,其中defaults to klass
,其中defaults to WebSocketClientProtocol
,这是WebSocketCommonProtocol
的子类,该子类可能未添加任何内容进一步的延误。protocol.handshake(...)
protocol.fail_connection()
(如果确实发生了任何异常)。我不了解asyncio
,所以我就在这里停下来;某处可能还会有60秒的延迟,但如果没有,则可能是计算机运行缓慢。
答案 1 :(得分:0)
感谢帮助用户4815162342和wizzwizz4!这是我的最终解决方案。
我最终接受了wizzwizz4的建议,该建议是断开连接字符串,以便可以在其上使用asyncio.wait_for。
如果有人在乎代码本身就是看OBS,并且在开始流式传输时,请更改Screenly OSE上的资产以显示RTMP流。流停止后,请切换回Screenly OSE上的其他资产。
#! /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:
obsws = OBSWS('10.11.0.124', 4444, "password")
# if no response from OBS in 30 seconds EXIT
await asyncio.wait_for(obsws.connect(), timeout=30)
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))
except asyncio.TimeoutError:
logger("OBS NOT RUNNING-- TIMEOUT!")
except OSError:
logger("OBS IS NOT RUNNING")
except:
logger(str(sys.exc_info()[1]))
finally:
await obsws.close()
logger("Connection terminated.")
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()