[英]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.