ProcessPoolExecutor

学习多进程,当运行代码:

from concurrent.futures import ProcessPoolExecutor
import requests
import os


def get_page(url):
    print('<%s> is getting [%s]' % (os.getpid(), url))
    response = requests.get(url)
    if response.status_code == 200:  # 200代表状态:下载成功了
        return {'url': url, 'text': response.text}


def parse_page(res):
    res = res.result()
    print('<%s> is getting [%s]' % (os.getpid(), res['url']))
    with open('db.txt', 'a') as f:
        parse_res = 'url:%s size:%s\n' % (res['url'], len(res['text']))
        f.write(parse_res)


if __name__ == '__main__':
    p = ProcessPoolExecutor()
    l = [
        'http://www.baidu.com',
        'http://www.baidu.com',
        'http://www.baidu.com',
        'http://www.baidu.com',
    ]
    for url in l:
        p.submit(get_page, url).add_done_callback(parse_page)
        # 这里的回调函数拿到的是一个对象。
        # 得先把返回的res得到一个结果。即在前面加上一个res.result() #谁好了谁去掉回调函数
        # 回调函数也是一种编程思想。不仅开线程池用,开线程池也用
    p.shutdown()  # 相当于进程池里的close和join
    print('主', os.getpid())

出现

Exception in thread QueueManagerThread:
Traceback (most recent call last):
...
ValueError: need at most 63 handles, got a sequence of length 65

后来在p = ProcessPoolExecutor()括号内添加参 max_workers=3,就不报错了。
多线程的话,不需要在ThreadPoolExecutor()括号内添加max_workers参数。

from concurrent.futures import ThreadPoolExecutor
import requests
import os


def get_page(url):
    print('<%s> is getting [%s]' % (os.getpid(), url))
    response = requests.get(url)
    if response.status_code == 200:  # 200代表状态:下载成功了
        return {'url': url, 'text': response.text}


def parse_page(res):
    res = res.result()
    print('<%s> is getting [%s]' % (os.getpid(), res['url']))
    with open('db.txt', 'a') as f:
        parse_res = 'url:%s size:%s\n' % (res['url'], len(res['text']))
        f.write(parse_res)


if __name__ == '__main__':
    p = ThreadPoolExecutor()
    l = [
        'http://www.baidu.com',
        'http://www.baidu.com',
        'http://www.baidu.com',
        'http://www.baidu.com',
    ]
    for url in l:
        p.submit(get_page, url).add_done_callback(parse_page)
        # 这里的回调函数拿到的是一个对象。
        # 得先把返回的res得到一个结果。即在前面加上一个res.result() #谁好了谁去掉回调函数
        # 回调函数也是一种编程思想。不仅开线程池用,开线程池也用
    p.shutdown()  # 相当于进程池里的close和join
    print('主', os.getpid())

https://www.cnblogs.com/dylan-wu/p/7163823.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值