python多线程和多进程(二)
---恢复内容开始---
一、多进程
1、multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。
import time
from multiprocessing import Process
def func(name):
print('%s 函数开始,time:%s' %(name,time.ctime()))
# time.sleep(2)
print('%s 函数结束,time:%s' %(name,time.ctime())) if __name__ == "__main__":
p1=Process(target=func,args=('one',))
p2=Process(target=func,args=('two',))
p3=Process(target=func,args=('three',))
p4=Process(target=func,args=('four',))
p5 = Process(target=func, args=('five',))
p1.start()
p2.start()
p3.start()
p4.start()
p5.start()
print(u'主进程%s'%time.ctime())
结果:
one 函数开始,time:Sat Sep 08 17:15:40 2018
two 函数开始,time:Sat Sep 08 17:15:40 2018
主进程Sat Sep 08 17:15:40 2018
three 函数开始,time:Sat Sep 08 17:15:40 2018
four 函数开始,time:Sat Sep 08 17:15:40 2018
five 函数开始,time:Sat Sep 08 17:15:40 2018
one 函数结束,time:Sat Sep 08 17:15:42 2018
two 函数结束,time:Sat Sep 08 17:15:42 2018
three 函数结束,time:Sat Sep 08 17:15:42 2018
four 函数结束,time:Sat Sep 08 17:15:42 2018
five 函数结束,time:Sat Sep 08 17:15:42 2018
*所有函数并发执行(注意:在windows中Process()必须放到# if __name__ == '__main__':下#方法二(和上面效果一样)
import time
from multiprocessing import Process class Piao(Process):
def __init__(self,name):
Process.__init__(self)
self.name=name
def run(self):
print('%s 函数开始,time:%s' %(self.name,time.ctime()))
time.sleep(2)
print('%s 函数结束,time:%s' %(self.name,time.ctime())) if __name__ == '__main__':
p1=Piao('one')
p2=Piao('two')
p3=Piao('three')
p4=Piao('four')
#p.daemon = True(进程守护和线程守护一样)
p1.start()
p2.start()
p3.start()
p4.start()
print('主线程%s'%time.ctime())
2、join()方法是用来让主进程等待所有子进程结束并不影响子进程之间的并发:
import time
from multiprocessing import Process
class Piao(Process):
def __init__(self,name):
Process.__init__(self)
self.name=name
def run(self):
print('%s 函数开始,time:%s' %(self.name,time.ctime()))
time.sleep(2)
print('%s 函数结束,time:%s' %(self.name,time.ctime()))
if __name__ == '__main__':
tasks = []
tasks.append(Piao('one'))
tasks.append(Piao('two'))
tasks.append(Piao('three'))
tasks.append(Piao('four'))
for p in tasks:
p.start()
for p in tasks:
p.join()
print('主线程%s'%time.ctime())
结果:
one 函数开始,time:Sat Sep 08 17:37:43 2018
two 函数开始,time:Sat Sep 08 17:37:43 2018
three 函数开始,time:Sat Sep 08 17:37:43 2018
four 函数开始,time:Sat Sep 08 17:37:43 2018
one 函数结束,time:Sat Sep 08 17:37:45 2018
two 函数结束,time:Sat Sep 08 17:37:45 2018
three 函数结束,time:Sat Sep 08 17:37:45 2018
four 函数结束,time:Sat Sep 08 17:37:45 2018
主线程Sat Sep 08 17:37:45 2018 #主进程等所有子进程结束,子进程之间并不影响并发
5、进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就 是错乱,如何控制,就是加锁处理
#并发运行,效率高,但竞争同一打印终端,带来了打印错乱
#由并发变成了串行,牺牲了运行效率,但避免了竞争
from multiprocessing import Process,Lock
import os,time
def work(lock):
lock.acquire()
print('%s 函数开始,time:%s' %(os.getpid(),time.ctime()))
time.sleep(2)
print('%s 函数结束,time:%s' %(os.getpid(),time.ctime()))
lock.release()
if __name__ == '__main__':
lock=Lock()
for i in range(3):
p=Process(target=work,args=(lock,))
p.start()
24464 函数开始,time:Sat Sep 08 18:02:17 2018
24464 函数结束,time:Sat Sep 08 18:02:19 2018
21072 函数开始,time:Sat Sep 08 18:02:19 2018
21072 函数结束,time:Sat Sep 08 18:02:21 2018
13536 函数开始,time:Sat Sep 08 18:02:21 2018
13536 函数结束,time:Sat Sep 08 18:02:23 2018
之前打印是同一时间,是多个进程共享同一打印终端,但是加了锁后就不能共享了,但是依旧是并发,是锁限制了共享终端,在读写文件是需要枷锁,不然容易造成错乱
6、队列
Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,常用来在生产者和消费者线程之间的信息传递。queue.put方法用以插入数据到队列中,queue.get方法用来冲数据队列去除数据(先进先出)
产者消费者模式
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
基于队列实现生产者消费者模型
from multiprocessing import Process,Queue
import time,random,os
def consumer(q):
while True:
res=q.get()
if res in None: break
time.sleep(random.randint(1,3))
print('\033[45m%s 吃 %s\033[0m' %(os.getpid(),res)) def producer(q):
for i in range(20):
time.sleep(random.randint(1,3))
res='包子%s' %i
q.put(res)
print('\033[44m%s 生产了 %s\033[0m' %(os.getpid(),res))
q.put(None) if __name__ == '__main__':
q=Queue()
#生产者
p1=Process(target=producer,args=(q,))
#消费者
c1=Process(target=consumer,args=(q,))
#开始
p1.start()
c1.start()
print('主进程')
7、进程池
Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,就重用进程池中的进程。
from multiprocessing import Pool
import os,time
def work(n):
print('%s run,time:%s' %(os.getpid(),time.ctime()))
time.sleep(3)
return n**2 if __name__ == '__main__':
p=Pool(3) #进程池中从无到有创建三个进程,以后一直是这三个进程在执行任务
res_l=[]
for i in range(10):
res=p.apply_async(work,args=(i,)) #同步运行,阻塞、直到本次任务执行完毕拿到res
res_l.append(res) #异步apply_async用法:如果使用异步提交的任务,主进程需要使用jion,等待进程池内任务都处理完,然后可以用get收集结果,否则,主进程结束,进程池可能还没来得及执行,也就跟着一起结束了
p.close()
p.join()
for res in res_l:
print res.get(), #使用get来获取apply_aync的结果,如果是apply,则没有get方法,因为apply是同步执行,立刻获取结果,也根本无需get,‘,’无须换行打印
结果:
6684 run,time:Mon Sep 10 11:41:22 2018
732 run,time:Mon Sep 10 11:41:22 2018
10748 run,time:Mon Sep 10 11:41:22 2018
6684 run,time:Mon Sep 10 11:41:25 2018
732 run,time:Mon Sep 10 11:41:25 2018
10748 run,time:Mon Sep 10 11:41:25 2018
6684 run,time:Mon Sep 10 11:41:28 2018
732 run,time:Mon Sep 10 11:41:28 2018
10748 run,time:Mon Sep 10 11:41:28 2018
6684 run,time:Mon Sep 10 11:41:31 2018
0 1 4 9 16 25 36 49 64 81
#进程池最大容量设置三,因此每次只有三个异步进程执行,等待执行结束再安排
---恢复内容结束---
python多线程和多进程(二)的更多相关文章
- Python 多线程、多进程 (二)之 多线程、同步、通信
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...
- Python 多线程、多进程 (三)之 线程进程对比、多进程
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.多线程与多进 ...
- Python 多线程、多进程 (一)之 源码执行流程、GIL
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...
- Python多线程和多进程谁更快?
python多进程和多线程谁更快 python3.6 threading和multiprocessing 四核+三星250G-850-SSD 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很 ...
- python多线程与多进程--存活主机ping扫描以及爬取股票价格
python多线程与多进程 多线程: 案例:扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活) 普通版本: #扫描给定网络中存活的主机(通过ping来测试,有响应则说明主机存活)im ...
- python多线程与多进程及其区别
个人一直觉得对学习任何知识而言,概念是相当重要的.掌握了概念和原理,细节可以留给实践去推敲.掌握的关键在于理解,通过具体的实例和实际操作来感性的体会概念和原理可以起到很好的效果.本文通过一些具体的例子 ...
- 基于Windows平台的Python多线程及多进程学习小结
python多线程及多进程对于不同平台有不同的工具(platform-specific tools),如os.fork仅在Unix上可用,而windows不可用,该文仅针对windows平台可用的工具 ...
- python基础之多线程与多进程(二)
上课笔记整理: 守护线程的作用,起到监听的作用 一个函数连接数据库 一个做守护线程,监听日志 两个线程同时取一个数据 线程---->线程安全---->线程同时进行操作数据. IO操作--- ...
- python多线程,多进程
线程是公用内存,进程内存相互独立 python多线程只能是一个cpu,java可以将多个线程平均分配到其他cpu上 以核为单位,所以GIL(全局锁,保证线程安全,数据被安全读取)最小只能控制一个核,很 ...
- python 多线程和多进程
多线程与多进程 知识预览 一 进程与线程的概念 二 threading模块 三 multiprocessing模块 四 协程 五 IO模型 回到顶部 一 进程与线程的概念 1.1 进程 考虑一个场景: ...
随机推荐
- tyvj 1666 城市建设【最小生成树】
-Wall是个好东西,要不然我至死都看不出来我把(b[i]+b[j])写成了(b[i],b[j])-- 还是来自lyd的题解: (其实原来课件第一行式子写错了没有-1,然而我用sai手画了一个上去hh ...
- bzoj 1922: [Sdoi2010]大陆争霸【dijskstra】
d[u]为u被几个节点保护,d1[u]为最早到u的时间,d2[u]为u的最早可进入时间(保护点都被打下来了的时候),然后最终最早进入时间就是max(d1[u],d2[u]),把这个作为权值放进小根堆, ...
- bzoj 4078: [Wf2014]Metal Processing Plant【二分+2-SAT+枚举+并查集】
枚举从大到小s1,二分s2(越大越有可能符合),2-SAT判断,ans取min 思路倒是挺简单的,就是二分的时候出了比较诡异的问题,只能二分s2的值,不能在数组上二分... 有个优化,就是当不是二分图 ...
- bzoj 4071: [Apio2015]巴邻旁之桥【splay】
用权值线段树会容易一些并快一些,但是想复健一下splay所以打了splay 然后果然不会打了. 解题思路: 首先把家和办公室在同一侧的提出来直接加进答案里: 对于k=1,直接选所有办公室和家的中位数即 ...
- bzoj 2876: [Noi2012]骑行川藏【拉格朗日乘数法+二分】
详见: http://blog.csdn.net/popoqqq/article/details/42366599 http://blog.csdn.net/whzzt/article/details ...
- 洛谷 P4015 运输问题 【最小费用最大流+最大费用最大流】
s向仓库i连ins(s,i,a[i],0),商店向t连ins(i+m,t,b[i],0),商店和仓库之间连ins(i,j+m,inf,c[i][j]).建两次图分别跑最小费用最大流和最大费用最大流即可 ...
- Luogu P2735 电网【真·计算几何/Pick定理】By cellur925
题目传送门 刷USACO偶然遇到的,可能是人生中第一道正儿八经的计算几何. 题目大意:在平面直角坐标系中给你一个以格点为顶点的三角形,求三角形中的整点个数. 因为必修5和必修2的阴影很快就想到了数学中 ...
- Luogu P2921 在农场万圣节 【tarjan in 有向图】 By cellur925
题目传送门 上来就想到既直接又简单的暴力方法,顺着每个房间的下一个走下去就好了,但是没想到最坏情况会达到1e5,100000的数据铁定超时. #include<cstdio> #inclu ...
- Taro 小程序 自定义导航栏
在小程序中,有的页面需求可能需要我们做一个自定义的导航栏, 今天就来踩一踩坑 首先需要在app.js 中给全局的导航栏隐藏, // app.js window: { navigationStyle: ...
- 基于.Net Core的API框架的搭建(1)
目标 我们的目标是要搭建一个API控制器的项目,API控制器提供业务服务. 一.开发框架搭建 1.开发前准备 开发前,我们需要下载如下软件,安装过程略: (1) 开发工具:VS2017 (2) 数据库 ...