CSIC_716_20191207【并发编程---进程与线程】
僵尸进程与孤儿进程
...........
守护进程
from Multiprocessing import Process
在 suboprocess.start( ) 的上一行,增加 subprocess.deamon( ),创建守护进程。当主进程执行完成时,subprocess也会被强制结束。
进程之间是相互独立的,主子两个进程在执行时,数据是隔离的。
进程、线程互斥锁:
from Multiprocessing import Lock
from threading import Lock
lock = Lock( )
lock.acquire( ) #加锁
lock.release( ) #释放锁
进程互斥锁是为了保证数据的读写安全。避免并发造成数据的错乱。
队列
队列可以使得进程之间的数据可以交互。
队列遵循先进先出(FIFO)的原则.
python中可以使用队列的三种方法
from multiprocessing import Queue
from multiprocessing import JoinableQueue # 基于Queue封装的
import queue # 内置的队列 q_obj = Queue(count) # 对应 import Queue,规定队列中能存放几个值,count为数量
q_obj = JoinableQueue(count) # 对应 import JoinableQueue
q_obj = queue.Queue(count) # 对应 import queue,以上三种方式,三选一。 q_obj.put_nowait(args) # 给队列中增加值,如果队列中满了,就会报错
q_obj.put(args) # 给队列中增加值, 如果队列满了,就会阻塞等待 q_obj.get_nowait() # 从队列中取值,如果取不到值,就会报错。
q_obj.get() # 从队列中取值,如果取不到,就会阻塞等待
IPC机制 Interprocess conmunication 进程间通信,在产生子进程时,将队列作为参数传入
生产者和消费者模型 基于队列,在producer 和consumer之间交互信息。
线程
进程是资源单位,开启一个进程,会自动开启一个主线程。
线程是执行单位,开启一个进程会。
IO密集型的程序,做成多线程,计算密集型的程序,做成多进程。
守护线程
主线程要盯着非守护线程结束,主线程才结束,线程上加了 deamon的就是守护线程
守护线程盯着主线程,主线程结束,守护线程立即陪葬。
线程池和进程池
from concurrent.futures import ThreadPoolExecutor(多线程) ProcessPoolExecutor(多进程)
pool = ThreadPoolExecutor(数量)、ProcessPoolExecutor(数量)
pool.submit( 函数方法名,参数 )
pool.shutdown( wait = True ) 暂停往池子里加东西
异步调用与回调机制
同步调用
取值用 .result()
# _*_ coding: gbk _*_
# @Author: Wonder from concurrent.futures import ThreadPoolExecutor
from threading import current_thread
import os def task1(num):
print('%s start calculation PID: %s' % (current_thread().getName(), os.getpid()))
res = num ** 2
return res def task2(a):
print(a) if __name__ == '__main__':
pool = ThreadPoolExecutor(5)
for i in range(50):
res = pool.submit(task1, i).result() # pool.submit(task1, i)对象的返回值,使用result()
print(res)
pool.shutdown(wait=True)
异步调用
# _*_ coding: gbk _*_
# @Author: Wonder from concurrent.futures import ThreadPoolExecutor
from threading import current_thread
import os def task1(num):
print('线程:%s开始计算,其进程PID: %s' % (current_thread().getName(), os.getpid()))
res = num ** 2
return res def task2(a):
print(a) # <Future at 0x2587d4e28c8 state=finished returned int> 是一个对象
a = a.result() # 对象取值,用result()
print('平方结果为:%s' % a) if __name__ == '__main__':
pool = ThreadPoolExecutor(5)
for i in range(50):
pool.submit(task1, i).add_done_callback(task2) # add_done_callback()回调函数,执行task2
pool.shutdown(wait=True)
a.result( ) # 对象取值
pool.submit(task1, i).add_done_callback(task2) --------->回调函数,执行完task1 后,自动去执行task2
最新文章
- 【开源】.Net 分布式服务中心
- Xcode 缓存 帮助文档 隐藏文件夹显示方法
- 自定义 导航条分割线,tabBar分割线颜色(或者是 去掉)
- Ubuntu 12.10使用apt安装Oracle/Sun JDK
- Cocos2d-x中的字符串
- bzoj 2716 天使玩偶(CDQ分治,BIT)
- Binary Tree Zigzag Level Order Traversal——LeetCode
- 异步陷阱之IO
- GameUnity 2.0 文档(三) 纸片人八方向
- 201521123066《Java程序设计》第七周学习总结
- Python:黑板课爬虫闯关第三关
- webDriver基本运用
- javascript基础修炼(1)——一道十面埋伏的原型链面试题
- zabbix监控到异常后自动执行对应命令
- C++设计模式——观察者模式(转)
- The Little Prince-12/07
- 百度地图足迹demo(多点轨迹生成)
- git 常用命令(不定期更新)
- H - Quicksum(1.5.3)
- Struts2学习总结——文件上传与下载
热门文章
- spring基于注解的事务控制
- windows 添加永久路由
- 【JS学习】慕课网2-7 练习题:制作新按钮,“新窗口打开网站” ,点击打开新窗口。
- mysql-一行分隔成多行数据
- 「NOI2016」循环之美 解题报告
- Android中的Handler,Looper,Message机制
- 二维差分前缀和——cf1202D(好题)
- python实现收邮件判断模块poplib,email
- [7.22NOIP模拟测试7]方程的解 题解(扩展欧几里得)
- 训练集(train set) 验证集(validation set) 测试集(test set)。