我想判断大约100个IP地址的可达性,并设置信号量并发任务的限制.但现在我不确定它到底是如何工作的,或者为什么它在代码示例中不工作.正如我所观察到的,"task_reachable"功能仍然正确执行.如果没有可访问的地址,那么在"try_ssh_connection"中,"所有"任务都是并行执行的,这使得代码速度非常慢.
class test_class():
def __init__(self):
self.username = "username"
self.password = "password"
self.ips = open("open_ip_list")
def create_async(self):
asyncio.run(self.create_tasks())
async def boundary_task(self,ip):
sem = asyncio.Semaphore(2)
async with sem:
return await self.task_reachable(ip)
async def create_tasks(self):
timer = Timer(text=f" task time: {{:.1f}}")
timer.start()
tasks = [
asyncio.ensure_future(self.boundary_task(i))
for i
in self.ips
]
await asyncio.gather(*tasks)
timer.stop()
async def task_reachable(self, ip):
url = "http://" + ip.strip("\n") + "/example_website.html"
session = aiohttp.ClientSession()
try:
resp = await session.get(url, ssl=False, timeout = 1)
await resp.read()
await session.close()
except:
await session.close()
await self.try_ssh_connection(ip, url)
await session.close()
async def try_ssh_connection(self, host, url):
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=self.username, password=self.password)
print("go")
except paramiko.AuthenticationException:
print( "Username or Password wrong!")
await self.stop_fun()
except OSError:
print("Network is not reachable")
await self.stop_fun()
async def stop_fun(self):
stop_event = asyncio.Event()
try:
stop_event.set()
except RuntimeError:
pass
if __name__ == "__main__":
app = test_class()
app.create_async()