什么我们得了解清楚什么是进程,进程就是系统分配的一个资源单位,真正在程序中干活得是线程,默认是每个进程中都拥有一个线程

然后我们在了解下什么是进程池这个概念

   进程池是的数量是取决于我当前电脑的逻辑处理器此时我们程序是异步并发的程序(即多个CPU同时执行多个任务)而我们之前学的进程下面创建子进程是异步并行的程序(即一个CPU执行多个任务)这既是两者之间的差别

Process 和 Pool 区别:
Process : 属于异步并发程序,主进程会默认等待子进程全部执行完毕之后,在终止程序
Pool : 属于异步并行程序,在没有任何阻塞的情况下,只要主进程执行完毕,会立刻终止所有子进程;

p = Pool(6):
代表同一时间最多允许并行6个进程;

进程池pool里面的参数
如果Pool不加任何参数,默认使用的是os.cpu_count()获取到的数量 逻辑处理器
如果加了参数,就使用当前参数值,所代表的是同一时间最大允许的进程数(并行)

在进程池中,如果一个进程执行任务的速度太快,会包揽更多的任务执行,就不会创建新的进程;

# (1) 比较进程池和进程之间的速度 => 进程池速度更快

 1 def func(num):
2 print(os.getpid())
3 # print(num)
4 # time.sleep(0.1)
5 for i in range(1000000):
6 pass
7 # 27612 27524 25940 26448 27520 26204
8 if __name__ == "__main__":
9 # 记录开始时间
10 startime = time.time()
11 # 1.创建进程池
12 p = Pool(6)
13 for i in range(100):
14 # 2.异步并行执行进程
15 p.apply_async(func,args=(i,))
16 # 3.关闭进程池
17 p.close()
18 # 4.等待子进程全部执行结束之后,在向下执行
19 p.join()
20 # 记录结束时间
21 endtime = time.time()
22 print("1号运行的时间是:",endtime-startime) # 0.5326602458953857
23 print("进程池运行结束 ... ")
24
25 # 计算process运行的时间
26 startime = time.time()
27 lst = []
28 for i in range(100):
29 p = Process(target=func,args=(i,))
30 p.start()
31 lst.append(p)
32
33 for i in lst:
34 i.join()
35 endtime = time.time()
36 print("2号运行的时间是:",endtime-startime) # 2.051966428756714
37 print("process运行结束 ..")

# 旧版进程池,主进程执行结束后,立刻终止子进程;

def func(num):
print(os.getpid()) if __name__ == "__main__": # .创建进程池
p = Pool()
for i in range():
# .异步并行执行进程
p.apply_async(func,args=(i,))
# .关闭进程池
p.close()
# .等待子进程全部执行结束之后,在向下执行
p.join() print("进程池运行结束 ... ")

# (2) apply 同步程序,可以直接获取子进程中的返回值(了解)

  

def task(num):
print("num:%s 进程号%s"%(num,os.getpid()))
return os.getpid() if __name__ == "__main__":
# 同一时间最多运行并行4个进程
p = Pool()
for i in range():
res = p.apply(task,args=(i,))
print(">>>",res)
print(" 主程序执行结束 ... ")

# (3) apply_async 异步程序 , 可以直接通过get获取子进程中的返回值

 def task(num):
time.sleep(random.uniform(0.1,1))
# print("num:%s 进程号%s"%(num,os.getpid()))
return os.getpid() if __name__ == "__main__":
lst = []
setvar = set()
p = Pool()
for i in range(20):
res = p.apply_async(task,args=(i,))
lst.append(res) # print(lst)
for i in lst:
# 用来获取当前子进程的返回值 get函数本身含有阻塞,不加close和join一样可以
res = i.get()
# print(res)
setvar.add(res) print(setvar) # {28136, 25480, 20472, 28012, 27344, 24984} # 3.关闭进程池
# p.close()
# 4.等待子进程全部执行结束之后,在向下执行
# p.join() print("finish")

# (4) map (与高阶函数map使用方法一样,区别在于并发和并行) 返回列表

def task(num):
print("num:%s 进程号%s"%(num,os.getpid()))
time.sleep(0.1)
return num ** 2 if __name__ == "__main__":
p = Pool()
res = p.map(task,range(100))
print(res)
print("主进程 finish")

# (5) close 和 join 同时使用,或者同时不适用,必须是一对

def task(num):
# print("num:%s 进程号%s"%(num,os.getpid()))
# time.sleep(0.1)
return num ** 2

if __name__ == "__main__":
lst = []
p = Pool()
for i in range(20):
# res 返回的是异步的进程对象
res = p.apply_async(task,args=(i,))
lst.append(res)
"""
for i in lst:
# 在获取返回值的同时,加了阻塞
print(i.get())
"""
# 关闭进程池
p.close()
# p.apply_async(task,args=(100))
p.join()

print("主进程 finish")

python从入门到放弃之进程进阶篇的更多相关文章

  1. python从入门到放弃之进程

    在理解进程之前我们先了解一下什么是进程的概念吧 以下就是我总结的一些基本的进程概念 进程就是正在运行的程序,它是操作系统中,资源分配的最小单位(通俗易懂点也就是电脑给程序分配的一定内存操作空间).资源 ...

  2. python从入门到放弃之进程锁lock

    # ### lock (互斥锁)"""# 应用在多进程当中# 互斥锁lock : 互斥锁是进程间的get_ticket互相排斥进程之间,谁先抢占到资源,谁就先上锁,等到解 ...

  3. [Python 从入门到放弃] 6. 文件与异常(二)

    本章所用test.txt文件可以在( [Python 从入门到放弃] 6. 文件与异常(一))找到并自行创建 现在有个需求,对test.txt中的文本内容进行修改: (1)将期间的‘:’改为‘ sai ...

  4. [Python 从入门到放弃] 1. 列表的基本操作

    ''' 列表 Create By 阅后即焚 On 2018.1.29 ''' 1. 列表的定义 列表看起来好像其它编程语言中的数组,但列表具备更加强大的功能,它是Python完备的集合对象,现在,你可 ...

  5. Python 学习入门(23)—— 进程

    本文介绍Python的os包中有查询和修改进程信息的函数,Python的这些工具符合Linux系统的相关概念,所以可以帮助理解Linux体系. 1. 进程信息 os包中相关函数如下: uname()  ...

  6. Python从入门到放弃系列(Django/Flask/爬虫)

    第一篇 Django从入门到放弃 第二篇 Flask 第二篇 爬虫

  7. python全栈开发从入门到放弃之函数进阶

    1.三元运算 a= 1 b=2 max = (a if a>b else b ) #条件成立的结果 if 条件 else 条件不成立的结果 print(max) 2.先上一首python之禅 i ...

  8. python从入门到放弃--线程进阶

    # ### 死锁,递归锁,互斥锁 from threading import Thread,Lock import time noodle_lock = Lock() kuaizi_lock = Lo ...

  9. python从入门到放弃之守护进程

    # ### 守护进程 默认情况下,主进程要等待所有子进程执行完毕之后,才会关闭程序,释放资源守护进程进行在主进程代码执行结束之后,就直接关闭;守护进程守护的是主进程 语法: 进程.daemon = T ...

随机推荐

  1. 微软Cloud+AI本地化社区更新

    有关微软Cloud+AI本地化方面的介绍请参见我之前的文章:<微软Cloud+AI本地化社区贡献指南>,本文将公布该社区最新的活动变更事宜. MLCP改进 我们想借此机会向您介绍我们在社区 ...

  2. Maven更改本地默认仓库时遇到的问题。 No implementation for org.apache.maven.model.path.PathTranslator was bound

    按照提示去查看log日志 2019-10-22 16:52:08,646 [ 161168]  ERROR -      #org.jetbrains.idea.maven - com.google. ...

  3. 第十五周博客作业 <西北师范大学| 周安伟>

    第十五周作业 助教博客链接https://home.cnblogs.com/u/zaw-315/ 作业要求链接https://www.cnblogs.com/nwnu-daizh/p/10946673 ...

  4. python如何实现元素等待

    一.为什么要元素等待? 在UI自动化过程中,元素的出现受网络环境.设备性能等多种元素影响.因此,元素加载和脚本运行到该元素的时间不一致,会报错:元素无法定位. 简单举下例子:实际UI自动化测试中,点击 ...

  5. Mybatis拦截器(六)

    拦截器的作用就是我们可以拦截某些方法的调用,在目标方法前后加上我们自己逻辑. Mybatis拦截器设计的一个初衷是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑. Mybat ...

  6. [探究] 用舞蹈链(DLX)解决一类数独问题

    考虑精准覆盖问题的本质--我们把行看做决策,把列看做任务,那么其实质就是通过决策来完成任务. 那么我们来考虑数独问题的本质,对于一个\(n^2\cdot n^2\)的数独而言,他的目标函数有四个: 1 ...

  7. jenkins报错 Host key verification failed.

    一.Host key verification failed 问题描述 在本地windows机器上安装了jenkins,在git bash命令行窗口可以使用git pull命令,但是在jenkins ...

  8. LeetCode 622:设计循环队列 Design Circular Queue

    LeetCode 622:设计循环队列 Design Circular Queue 首先来看看队列这种数据结构: 队列:先入先出的数据结构 在 FIFO 数据结构中,将首先处理添加到队列中的第一个元素 ...

  9. Gin框架 - 数据绑定和验证

    概述 上篇文章分享了 Gin 框架使用 Logrus 进行日志记录,这篇文章分享 Gin 框架的数据绑定与验证. 有读者咨询我一个问题,如何让框架的运行日志不输出控制台? 解决方案: engine : ...

  10. Sitecore 8.2 渠道简介

    渠道是联系人通过广告系列或面对面与您的品牌互动时所使用的路径.联系人可以通过手机上的应用与您的品牌互动,点击社交网络上的广告访问您的网站,或访问实体店购买商品.使用Sitecore体验平台,您可以使用 ...