非常感谢!
任务描述:我想使用Python来收集免费的https代理服务器信息并进行测试。 代码需要几分钟才能运行(大约 100 个代理服务器进行测试(,我知道多处理可以显着提高执行速度,但是,我尝试了几天但没有运气......似乎所有子进程都在执行重复的任务,而不是一起执行。
在这里需要帮助...
代码:
import requests
import re
import telnetlib
import multiprocessing
def run(info1, info2):
try:
tn = telnetlib.Telnet(info1, port= info2, timeout= 2)
except:
print('not working !')
else:
proxy_server = 'http://' + info1 + ':' + info2
print(proxy_server)
if __name__=='__main__':
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'}
html = requests.get('https://www.sslproxies.org', headers=headers, allow_redirects=False)
pattern = re.compile('<td>(d.*?)</td><td>(d+)</td>', re.S)
items = re.findall(pattern, html.text)
for item in items:
for i in range(5):
p = multiprocessing.Process(target=run(item[0], item[1]), args=('msc%s' % i,))
p.start()
您的任务基本上是IO绑定的(您正在从许多远程服务器请求信息(,因此您需要"并发"请求所有服务器并等待它们的回复。这是您应该使用 Python 等语言的并发功能的典型用例。不知何故,多处理是实现并发的一种方法(严格来说这样的断言是不正确的(,但是如果您需要请求数千台服务器会发生什么?创建数千个流程并不是好方法。
我重新命令这篇文章:https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html
它将帮助您以非常有效的方式实现您正在尝试做的事情。
"for i in range(5("生成相同的过程 5 次,产生重复。这可以通过删除它并以更简单的方式创建过程来实现。
for item in items:
p = multiprocessing.Process(target=run, args=(item[0], item[1],))
p.start()