首页 > 系统相关 >python 多进程

python 多进程

时间:2023-04-09 19:33:07浏览次数:48  
标签:python ip future proxy 进程 proxies pool

背景:串行执行慢,考虑使用多进程来加速。

1 多进程

这块可以参考:https://blog.csdn.net/Hao_ge_666/article/details/120571731

2 多线程

这块可以参考:https://blog.csdn.net/Hao_ge_666/article/details/120603014

3 进程池

参考:https://zhuanlan.zhihu.com/p/568073350

当任务需求重,需要并发更多的进程时,每次手动维护多进程则会变得不太方便。python 提供了进程池的相关能力,通过指定一个固定资源量的进程池,在进程池中开启或回收进程,整体管理由进程池维护。

3.1 基础模版
# 实例化一个进程池对象,max_workers 设置进程池中能同时运行的最大进程数目,如果不指定默认为 cpu 的核数
pool = ProcessPoolExecutor(max_workers=3)

# submit是非阻塞方法,提交一个函数到进程池中,返回一个 future 对象
future1 = pool.submit(target_func, param)

# 关闭进程池
pool.shutdown()

# 与全局函数 map 类似, 将启动多个线程,以异步方式立即对 iterable 执行 map 处理
pool.map(func, iterable)
或者采用 with 写法,使用完毕自动回收:
with ProcessPoolExecutor(max_workers=3) as pool:
	pool.submit(target_func, param)
3.2 获取进程相关信息的函数
future1.done()   # 判断 future 代表的任务是否执行完成

future1.result()   # 获取 future 代表的任务结果,该方法为阻塞方法,timeout 参数可以指定最多阻塞多少秒

future1.cancel()   # 取消 future 代表的任务,执行中的任务取消不了,返回 bool

future1.add_done_callback(func)   # 为 future代表任务注册一个回调函数,任务执行完成之后会自动调用该函数,被调用的函数默认接收一个 feture 对象

as_completed()   # 接收一个 future 列表,返回一个生成器,通过迭代能够获取到每一个 future 的结果。
其中 result() 可以获取进程函数的返回结果。
3.3 for 循环多进程任务开启&运行

举个栗子:当我们需要同时验证一批代理 ip 是否可用时,串行的对每个 ip 运行一次检查逻辑显然并不是一个高效的做法,为了加速验证,可以借助进程池,下面是示例代码

from tqdm import tqdm	# 一个进度条组件


def check_proxy_icanhazip(ip, port):
	print('test func')
	return True

all_proxies = [
	{'ip':'11.11.11.11', 'port':'111'}, {'ip':'22.22.22.22','port':'222'}
]	# 待验证代理

print(f'IP 验证,主进程开始执行, pid:{os.getpid()}')
all_proxies_filter = dict()

# with 方式开启进程池
with ProcessPoolExecutor(max_workers=50) as pool:
	# 循环的对每个代理进行验证
	for proxy in tqdm(all_proxies, desc='checking proxies...'):
		# 向进程池中提交一次验证操作
		task = pool.submit(check_proxy_icanhazip, proxy['ip'], proxy['port'])
		# 进程执行返回结果(即 check_proxy_icanhazip() 的执行返回结果)
		res = task.result()
		if res:
			all_proxies_filter[proxy['ip']] = proxy
all_proxies_filter = all_proxies_filter.values()
print(all_proxies_filter)


""" 方式2:as_completed() 方式来接收一个 future 列表
# 但是这种方式无法方便的自定义每个进程运行结束的判断逻辑
all_task = [pool.submit(check_proxy_icanhazip, (proxy['ip'], proxy['port'])) for proxy in all_proxies]
for future in as_completed(all_task):
    res = future.result()
    print(f"res: {res}")
"""

标签:python,ip,future,proxy,进程,proxies,pool
From: https://www.cnblogs.com/zishu/p/17300868.html

相关文章

  • python time测试
    pythontime测试 importtimedeftimer(seconds):start_time=time.time()whileTrue:elapsed_time=time.time()-start_timeifelapsed_time>=seconds:breakprint("Time'sup!")timer(10)......
  • golang 编译碰到问题 Package python-2.7 was not found in the pkg-config search pa
    golang运行单测或者编译程序时提示需要配置PKG_CONFIG_PATH环境变量,原因是在程序里使用了go-python包,要求运行环境有python2.7,并设置PKG_CONFIG_PATH环境变量,解决方案如下:#pkg-config--cflags--python-2.7Packagepython-2.7wasnotfoundinthepkg-configsear......
  • python 提取字符中的数字
      一、isdigit()函数isdigit()函数是检测输入字符串是否只由数字组成。如果字符串只包含数字则返回True否则返回False。1234567891011dream="123456"print(dream.isdigit())#返回:True dream="123abc456"print(dream.isdigit())#返回:Fa......
  • [oeasy]python0131_[趣味拓展]各种符号_汉语拼音符号_中文全角英文字母_中文全角标点
    各种符号回忆上次内容中文字符可以有各种分类方法声母拼音检字法韵母合辙押韵的分类偏旁部首实际上unicode的排序方法我们以前勇闯地下城时候获得了一把屠龙宝刀给他镶上了❤️宝石这宝石应该如何理解?今天我们就来彻底解密红色爱心的原理闭环首先是文字我们的汉字可以构成一个闭......
  • [oeasy]python0131_[趣味拓展]各种符号_汉语拼音符号_中文全角英文字母_中文全角标点
    各种符号回忆上次内容中文字符可以有各种分类方法声母拼音检字法 韵母合辙押韵的分类 偏旁部首实际上unicode的排序方法  ​ 添加图片注释,不超过140字(可选) 我们以前勇闯地下城时候获得了一把屠龙宝......
  • 性能最快的代码分析工具,Ruff 正在席卷 Python 圈!
    几天前,Python开源社区又出了一个不小的新闻:HTTPX和Starlette在同一天将在用的代码分析工具(flake8、autoflake和isort)统一替换成了Ruff。HTTPX是一个支持异步的HTTP客户端,Starlette是一个轻量级的ASGI框架,它们都是Python社区里的明星项目,目前加起来有近20Kstar......
  • Python+Selenium.webdriver实现WEB端UI自动化测试
    本篇记录基于Python+Selenium.webdriver实现WEB端UI自动化测试,其中测试用例使用excel维护。 1.项目选取(登录页无验证码校验的项目)该示例选取的是登录页不需要输入验证码校验的基础页面(考虑到现在大部分项目都是需要进行验证码校验的,后面研究后再出一篇相关的分享。) 2.环境......
  • python基础十(常用模块)
    一time与datetime模块1、timeimporttime#时间分为三种格式:#1、时间戳:从1970年到现在经过的秒数#作用:用于时间间隔的计算print(time.time())#1680886728.1569963#2、按照某种格式显示的时间:2022-07-0617:12:11#作用:用于展示时间print(time.strftime('%Y-%......
  • python Selenium自动化测试
    转载自https://blog.csdn.net/tangya3158613488/article/details/106902110 Selenium自动化测试什么是自动化测试自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。总的概括即:将人为驱动的测试行为转化为机器执行的......
  • 浏览器层面优化前端性能(1):Chrom组件与进程/线程模型分析
    现阶段的浏览器运行在一个单用户,多合作,多任务的操作系统中。一个糟糕的网页同样可以让一个现代的浏览器崩溃。其原因可能是一个插件出现bug,最终的结果是整个浏览器以及其他正在运行的标签被销毁。现代操作系统已经非常健壮了,它让应用程序在各自的进程中运行和不会影响到其他程序......