在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python  C/ python3 中進(jìn)程之間通信,Queue

python3 中進(jìn)程之間通信,Queue

問題描述

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)

相關(guān)代碼

這是獲取代理,最后把所有的代理append到proxyList
clipboard.png

這是檢測(cè)代理可用性,Queue傳輸可用代理
clipboard.png

這是使用pipe傳輸,到最后打印也卡死了……
clipboard.png

代碼:

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!')

你期待的結(jié)果是什么?實(shí)際看到的錯(cuò)誤信息又是什么?

我想要開多個(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()
2017年1月12日 21:44