RUN__IT # 进程池与协程混合使用时-程序卡住问题

当在Python中使用gevent创建协程并结合进程池时,程序可能会在创建进程池时卡住。这个问题可以通过移除补丁并避免延时操作来解决,因为这样可以让程序继续执行而不会报错。不使用补丁时,gevent无法识别延时操作,因此创建的实际上是多进程而非协程。通过对比代码A(进程池+协程)和代码B(仅协程)的爬虫性能,发现前者速度明显更快。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用gevent创建协程前,我们一般进行打补丁,为了遇到延时操作不报错。但如果和进程池混合使用,就会在创建池子时程序卡住,不再往下执行。
此时把补丁去掉,并且不要用延时操作,程序就能继续执行,下载这种耗时过程,完全不需要打补丁且不会报错的

如果不用补丁,gevent根本不认识延时操作,所创建的不是协程,只是多进程而已。。。。。。。。。。。。。。。。

下面是爬取图片的代码,代码A用的进程加协程爬取:速度明显高于只用协程
代码B用的是协程,时间长了好多

代码A

进程池与协程

from multiprocessing import Pool,Manager
import gevent
import time
# from gevent import monkey
import urllib.request
import re


# 打补丁
# monkey.patch_all()  # 有进程池,所以把补丁去掉,要不在创建池子时卡住


def my_download(name,url):
    """下载并保存"""
    # 请求
    resp = urllib.request.urlopen(url)
    # 读取数据
    data = resp.read()
    # 保存
    with open("/home/python/Desktop/mi_zi_1/"+ name,"wb") as f:
        f.write(data)


def get_html(q,url,k):
    """解析出图片网址"""
    # 打开文件获取源码
    resp = urllib.request.urlopen(url)
    data = resp.read()

    # 正则匹配出图片网址
    urls = re.findall(r"//.*?large.*?\.jpg", data.decode("utf-8"))

    # 统计图片个数
    count = len(urls)
    q.put
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值