python3 中使用進(jìn)程通信,我爬蟲到一些代理,需要檢測(cè)可用性,使用validator函數(shù),然后我開了進(jìn)程池運(yùn)行validator函數(shù),validator中會(huì)把可用的代理put到Queue中,一開始是想用append到一個(gè)list中的,但是進(jìn)程之間不通信。
然后我在進(jìn)程join之前 q.get(), 但是運(yùn)行沒反應(yīng)
這是獲取代理,最后把所有的代理append到proxyList
這是檢測(cè)代理可用性,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): #驗(yàn)證代理可用性
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: #如果想要讓四個(gè)進(jìn)程一起來驗(yàn)證代理可用性是這樣么?
p.apply_async(validator, args = (proxy, q))
p.close()
p.join()
print(q.get()) #打印出queue
print('over!')
我想要開多個(gè)進(jìn)程一起檢測(cè)代理的可用性,然后把可用的代理返回,另外我對(duì)于開進(jìn)程池的方式也有點(diǎn)奇怪,
for proxy in proxyList:
p.apply_async(validator, args = (proxy,q))
雖然我前面聲明了是4個(gè)進(jìn)程,但是這樣會(huì)不會(huì)4個(gè)進(jìn)程都用來同時(shí)處理一個(gè)么?我想要的是4個(gè)進(jìn)程一起處理總的代理,驗(yàn)證可用性, 不過結(jié)果是好的,時(shí)間縮短了。
現(xiàn)在問題是如何返回可用的代理呢,Queue為什么會(huì)卡住呢?
因 Queue 容量有限,應(yīng)采用一邊生產(chǎn)、一邊消費(fèi)的同時(shí)運(yùn)作模式,以免隊(duì)列滿了造成 Queue.put() 堵塞。
下面這個(gè)例子,演示如何使用 ping 命令同時(shí)檢查多個(gè)域名/IP。
# -*- coding: utf-8 -*-
from subprocess import Popen, PIPE
from multiprocessing import Pool, Manager
def ping(host, q):
# ping 發(fā) 4 個(gè)包,超時(shí)時(shí)間為 1 秒。
p = Popen(['ping', '-c', '4', '-W', '1', host], stdout=PIPE, stderr=PIPE)
p.communicate()
q.put([host, p.returncode == 0 and 'good' or 'bad'])
if __name__ == '__main__':
hosts = [
'www.baidu.com',
'www.taobao.com',
'www.bad123host.com',
'1.2.3.4',
]
m = Manager()
q = m.Queue()
p = Pool(3)
for host in hosts:
p.apply_async(ping, (host, q))
p.close()
for i in range(len(hosts)):
item = q.get()
print(f'{i:03d} {item[0]} is {item[1]}')
p.join()北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。