python3 中进程之间通信,Queue

发布于 2022-09-07 21:35:12 字数 2183 浏览 39 评论 0

问题描述

python3 中使用进程通信,我爬虫到一些代理,需要检测可用性,使用validator函数,然后我开了进程池运行validator函数,validator中会把可用的代理put到Queue中,一开始是想用append到一个list中的,但是进程之间不通信。
然后我在进程join之前 q.get(), 但是运行没反应

相关代码

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

这是检测代理可用性,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): #验证代理可用性
    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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清旖 2022-09-14 21:35:12

Queue 容量有限,应采用一边生产、一边消费的同时运作模式,以免队列满了造成 Queue.put() 堵塞。

下面这个例子,演示如何使用 ping 命令同时检查多个域名/IP。

# -*- coding: utf-8 -*-
from subprocess import Popen, PIPE
from multiprocessing import Pool, Manager


def ping(host, q):
    # ping 发 4 个包,超时时间为 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()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文