多进程编程。

多任务,来至于百度:

    多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务。当多任务操作系统使用某种任务调度策略允许两个或更多进程并发共享一个处理器时,事实上处理器在某一时刻只会给一件任务提供服务。因为任务调度机制保证不同任务之间的切换速度十分迅速,因此给人多个任务同时运行的错觉。

 

关于并发与并行

    并发:运行的任务数 大于 CPU 核数(逻辑的)
    并行:运行的任务数小于等于CPU 核数(逻辑的)
 
 
1  创建进程
 

 

 
2  修改的后的代码
 

 

输出结果
 
父进程创建了子进程 ,并不代表父进程就先持行 谁先持行不一定。操作系统的调度算法决定。
 
 
简单的多任务原理。
 

 

 
 
3 多次 fork的问题
 
 

 

 
每次 fork 就会产生一个新的进程 往下 持行代码,运行的结果
 

 

 
4  multiprocessing 编写多进程程序
原因分析:因为windows 没有 fork可调用。python 的 multiprocessing模块提供了跨平台的多进程模块。
 
 
 
5 进程全局变量不共享
 
#想要完成进程间的数据共享,需要一些方法:命名管道/无名管道/共享内存/消息队列/网络等 ,通过Quene 实现进程之间的数据共享
def read(q):
n=q.qsize()
print('----长度----',n)
for i in range(n):
print(q.get())
print("----read_end-----")

def write(q):
for i in range(3):
q.put(i)
print("----write_end-----")

if __name__=='__main__':
q=Queue(3)
p1= Process(target=read,args=(q,))
p2= Process(target=write, args=(q,))
p2.start()
p2.join()
p1.start()
print("================")
 
 结果

 

 
6  主进程等待子进程的结束
 fork创建的子进程,主进程先持行玩就可以结束 对子进程没有影响。
 process 主进程会等待子进程结束 。
 
 
7 join 强调
p.join()   #阻塞  
p.join(1) 等待 1秒

 

 
 
8 终止 进程 terminate():不管任务是否完成,立即终止;
 
 
9 进程池
进程池的作用就是缓冲, 事先创建好一些进程,等用的时候直接拿去用。免得有大的并发的时候到达时使用一个创建一个。数据库连接池,tomcat 进程配置优化就是很好的例子。在 python 

multiprocessing 

中 提供了 Pool 对象 可以实现这种需求。
from multiprocessing import Process,Pool,Queue
def worker(num):
for x in range(2):
print('num:%s,pid:%s' % (num, os.getpid()))
time.sleep(1)

if __name__ == '__main__':
# 这个池子中同一时刻最多只能有3个进程
pool = Pool(2)
for x in range(3):
pool.apply_async(worker,(x,))


print('------------------------------1')
pool.close()
pool.join()
print('------------------------------2')
 结果:   进程池中只有两个进程,但是循环却要建立三个进程,所以就会阻塞,等前面两个进程运行完之后回收了 再拿个进程来运行。
 

 

 
 
posted @ 2018-01-19 00:08  我爱测试胜于爱自己  阅读(108)  评论(0)    收藏  举报