爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 19340|回复: 10

[经验总结] 电脑版996福报,能者多劳,鞭打快牛的神器---进程池

[复制链接]

新浪微博达人勋

发表于 2020-12-29 17:42:03 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
一、需求缘起

上周,我急于使用FTP传输文件,不并发传输,速度就是龟速,不能忍!

于是临时学习了多进程,
别问我问什么不用多线程,因为我还没学到那。

批量新建p0,p1,p2,......,p98,p99是通过exec()函数来实现的,
之前我用了eval()函数,试验后发现不是它。

批量新建进程代码
示例如下:
def f(i):
    print(i*10)

n=100#进程数
#创建进程:
for i in range(n):
    exec("p"+str(i)+"=Process(target=f,args=("+str(i)+"))")
#启动进程:
for i in range(n):
    exec("p"+str(i)+".start()")
#等待进程结束:
for i in range(n):
    exec("p"+str(i)+".join()")

对于多进程程序,我希望:所有进程中,谁忙完就再分配一个任务
能者多劳,始终维持着满负荷运转的007剥削模式,使电脑获得“福报”
我周末想过自己设计下这种工作机制,
不过,我猜,这么基础又使用的功能,肯定已经被做好了,无需我重复造轮子。
于是我很快发现,我需要的就是------“进程池”!

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2020-12-30 09:03:16 | 显示全部楼层
后面你会发现  网络带宽最后成了瓶颈..
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-12-30 09:32:01 | 显示全部楼层
topmad 发表于 2020-12-30 09:03
后面你会发现  网络带宽最后成了瓶颈..

我使用的宽带相对于项目需求是富余的,我做的只是企业应用罢了,
只有外网大量访问才会出现宽带瓶颈
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-12-30 09:37:13 | 显示全部楼层
二、“进程池”基本概念

进程池可以提供指定数量的进程给用户使用,
即当有新的请求提交到进程池中时,如果池未满,则会创建一个新的进程用来执行该请求;
反之,如果池中的进程数已经达到规定最大值,那么该请求就会等待,
只要池中有进程空闲下来,该请求就能得到执行。

阻塞方式:必须等待上一个进程退出才能执行下一个

非阻塞方式:可以并行执行多个进程

参考资料:Python使用进程池管理进程





密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-12-30 09:43:58 | 显示全部楼层
mark
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-12-30 09:45:11 | 显示全部楼层
本帖最后由 15195775117 于 2020-12-30 09:50 编辑

三、“进程池”代码固定套路

题设:现在有10个执行函数 f 的任务,使用3个进程

from multiprocessing import Pool
import time,os


def f(name):
    print('子进程(%s)打印参数:%s'%(os.getpid(),name))
    time.sleep(0.1)


if __name__=="__main__":
    p=Pool(3)#分配3个进程
    for i in range(10):
        p.apply_async(f,args=(i,))#使用非阻塞方式调用函数
        
    p.close()#关闭Pool,使其不再接受新的任务
    p.join()#主进程阻塞,等待子进程退出,必须在close或terminate之后使用
    print('所有子进程结束')


#其他函数:
# p.apply(func,args,kwds)#阻塞方式调用函数
# p.terminate()#终止

# 输出结果:
# 子进程(27408)打印参数:0
# 子进程(27384)打印参数:1
# 子进程(27408)打印参数:2
# 子进程(12972)打印参数:3
# 子进程(27384)打印参数:4
# 子进程(27408)打印参数:5
# 子进程(12972)打印参数:6
# 子进程(27384)打印参数:7
# 子进程(27408)打印参数:8
# 子进程(12972)打印参数:9
# 所有子进程结束



密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-1-2 21:55:50 | 显示全部楼层
题目总是很魔性{:eb301:}{:eb301:}{:eb301:},学习了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-1-5 14:20:54 | 显示全部楼层
搞这么复杂,lftp的一句pget就完事了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-1-5 14:39:50 | 显示全部楼层
werewolf 发表于 2021-1-5 14:20
搞这么复杂,lftp的一句pget就完事了

这个是哪个上的工具呢?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-1-5 16:02:35 | 显示全部楼层
lftp,Linux下的一个命令行工具
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表