了解 Python 中的异步。
我似乎了解异步的特殊性,但是有一个程序需要长时间等待,并且由于某种原因调度程序正在等待,而不是检查另一个对象。
该计划的想法是网络服务的可用性。
使用 pythonping 库检查服务是否可用
import asyncio
from pythonping import ping
async def ping_host(host):
return ping(host).success() # True or False при проверке
async def check_host(host):
check = await ping_host(host)
if check:
print(host,'RUN')
else:
print(host, 'STOP')
tasks = [
asyncio.ensure_feature(check_host('srv-01')),
asyncio.ensure_feature(check_host('srv-02')),
asyncio.ensure_feature(check_host('srv-03'))]
event_manager = asyncio.get_event_loop()
event_manager.run_until_complete(asyncio.gather(*tasks))
event_manager.close()
如果只是指定 check = await ping(host).success() 那么会报错,所以 async def ping_host.
那么有什么问题呢?在 check = await ping_host(host) 如果服务器不可用,那么 ping 会等待很长时间(4-5 秒),所以这里建议在等待响应的同时切换到另一个程序,但由于某种原因,这在我的代码中不起作用。
网上有很清晰的流程图(https://yandex.ru/images/search?from=tabbar&text=asynchronous%20python%203&pos=7&img_url=https%3A%2F%2Fmedia.proglib.io%2Fwp-uploads% 2F2018 %2F07%2Fasync-programming-717x1024.jpg&rpt=simage ) 基于此,在我的程序块(I/O,睡眠)中,event_manager 应该已经加载了任务 2。
修饰符
async
不会自动使同步函数异步。是的,您现在可以创建这样一个函数await
,但它不会在等待时返回控制权,因为该函数本身没有一个构造await
,执行时可以返回控制权。该函数将被完全执行,然后才返回控制权。这种情况下最正确的做法是采取现成的异步方式
ping
,例如aioping。文档中的用法示例。注意await
函数内部do_ping
:如果您愿意,您可以自己将同步函数转换为异步函数,可以在此处找到示例。但通常最好使用支持开箱即用的异步调用的库。