python3 中进程之间通信,Queue
问题描述
python3 中使用进程通信,我爬虫到一些代理,需要检测可用性,使用validator函数,然后我开了进程池运行validator函数,validator中会把可用的代理put到Queue中,一开始是想用append到一个list中的,但是进程之间不通信。
然后我在进程join之前 q.get(), 但是运行没反应
相关代码
这是获取代理,最后把所有的代理append到proxyList
这是检测代理可用性,Queue传输可用代理
这是使用pipe传输,到最后打印也卡死了……
代码:
proxyList = []
def getProxy():
r = requests.get(url, headers = headers, proxies = proxies)
ips = re.findall('"PROXY_IP":"([\d.]+)"', r.text)
ports = re.findall('"PROXY_PORT":"([\w]+)"', r.text)
for i, p in zip(ips, ports):
p = int(p,16)
ip = 'http://'+i+':'+str(p)
proxyList.append(ip)
print('爬取到的代理如下: \n')
print(proxyList)
# getProxy()
def validator(proxy, cc): #验证代理可用性
url = 'https://www.baidu.com'
try:
r = requests.get(url, #尝试代理连接
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'},
proxies = {
'http': proxy,
'https': proxy,
}, timeout = 5)
if (r.status_code == requests.codes.ok): #连接ok,print + q.put()
print('valid proxy:', proxy)
q.put(proxy)
else:
print('failed:', proxy)
except Exception as e:
print('error:', proxy)
if __name__ == '__main__':
print('start!')
getProxy()
p = Pool(5)
q = Queue()
for proxy in proxyList: #如果想要让四个进程一起来验证代理可用性是这样么?
p.apply_async(validator, args = (proxy, q))
p.close()
p.join()
print(q.get()) #打印出queue
print('over!')
你期待的结果是什么?实际看到的错误信息又是什么?
我想要开多个进程一起检测代理的可用性,然后把可用的代理返回,另外我对于开进程池的方式也有点奇怪,
for proxy in proxyList:
p.apply_async(validator, args = (proxy,q))
虽然我前面声明了是4个进程,但是这样会不会4个进程都用来同时处理一个么?我想要的是4个进程一起处理总的代理,验证可用性, 不过结果是好的,时间缩短了。
现在问题是如何返回可用的代理呢,Queue为什么会卡住呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
因 Queue 容量有限,应采用一边生产、一边消费的同时运作模式,以免队列满了造成 Queue.put() 堵塞。
下面这个例子,演示如何使用 ping 命令同时检查多个域名/IP。