[英]Python async proxy status check
美好的一天,即时通讯试图掌握python中的异步内容,并陷入了应该可以轻松解决的情况,但是我仍然对我在做什么错感到沮丧。 建议我有一个代理列表,我想检查服务器是否已启动并正在运行,更重要的是我想以异步方式进行操作,不幸的是,与同步功能的比较显示了相同的执行时间。
因此,代码如下:
import requests
import os
import asyncio
from lxml import html
class GetUkProxy:
url = "https://free-proxy-list.net/uk-proxy.html"
def __init__(self):
self.getProxyList(self.url)
def getProxyList(self, url):
self.proxies = []
data = requests.get(url)
response = html.fromstring(data.text)
for item in response.xpath('//table[@id="proxylisttable"]/tbody/tr'):
ip, port = item.getchildren()[:2]
self.proxies.append({'IP': ip.text, 'Port': port.text, 'Status': 'unknown'})
def printProxies(self):
try:
for proxy in self.proxies:
print(proxy['IP'] + ':' + proxy['Port'], proxy['Status'])
except:
print("Proxy list is empty")
def checkProxies(self):
loop = asyncio.get_event_loop()
data = loop.run_until_complete(self.checkProxyList())
loop.close()
async def checkProxyList(self):
try:
tasks = []
for proxy in self.proxies[:10]:
task = asyncio.ensure_future(self.checkProxy(proxy))
tasks.append(task)
await asyncio.gather(*tasks)
except:
print('Proxy list is empty')
async def checkProxy(self, proxy=None):
try:
check = os.system('ping -n 4 -w 2 ' + proxy['IP'])
if not check:
proxy['Status'] = 'Dead'
else:
proxy['Status'] = 'Alive'
except Exception as exp:
print(exp)
def syncCheck(self):
for item in self.proxies[:10]:
check = os.system('ping -n 4 -w 2 ' + item['IP'])
异步checkProxies的执行时间等于同步syncCheck的执行时间,因此欢迎您提出错误根源以及如何解决错误的任何想法。
os.system
是阻止事件循环的同步功能。
您可以使用asyncio.create_subprocess_exec
异步执行系统命令,并避免阻塞事件循环。
async def checkProxy(self, proxy=None):
try:
check = await asyncio.create_subprocess_exec(
'ping', '-c', '4', '-W', '2', proxy['IP'], stdout=asyncio.subprocess.PIPE)
out, error = await check.communicate()
proxy['Status'] = 'Alive'
if error:
proxy['Status'] = 'Dead'
except Exception as exp:
print(exp)
编辑:在checkProxies
方法中,我们将列出要一起运行的期货。
def checkProxies(self):
loop = asyncio.get_event_loop()
proxies = self.proxies[:10]
tasks = [self.checkProxy(proxy) for proxy in proxies]
loop.run_until_complete(
asyncio.gather(
*tasks
)
)
loop.close()
uk = GetUkProxy()
uk.checkProxies()
print(uk.proxies)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.