五杀摇滚小拉夫

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理


****全局变量:

进程 对于全局变量都各自有一个
线程 共享一个全局变量,但操作全局变量有问题,容易造成混乱一个线程未结束直接运行另一个线程。导致出错。


***多线程的一些问题:


多线程程序的执行顺序是不确定的。当执行到sleep语句时,线程将被阻塞(Blocked),到sleep结束后,线程进入就绪(Runnable)状态,等待调度。而线程调度将自行选择一个线程执行。上面的代码中只能保证每个线程都运行完整个run函数,但是线程的启动顺序、run函数中每次循环的执行顺序都不能确定。

***多线程vs进程

进程是系统自动进行资源分配和调度的一个独立单位
线程是进程的一个实体,是cpu调度和分派的基本单位

一个程序至少一个进程,一个进程至少一个线程
进程在执行过程中拥有独立的内存单元,而多线程共享内存,执行效率高

线程:计算机密集型(科学计算,解码编码)
io密集型(web,文件读写)

——————————————————————————————————————————————————————

同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程。
异步交互:指发送一个请求,不需要等待返回,随时可以发送下一个请求,不需要等待。

区别:异步交互优先级更高

同步交互:银行转账系统

——————————————————————————————————————————————————————

#创建进程对象并指定对象要完成的任务,为启动处于初始化状态
p1=Process(target=f)

target 表示进程实例所调用的对象

#启动进程实例,但并不立刻运行,等待cpu使用资源

p1.start()

创建的Process对象,默认daemon 是False 非守护进程

#进程 :
1 守护 2 非守护
一个程序可以启动很多进程,至少有一个非守护进程,一点只剩下守护进程,程序立即结束

#返回对象名
current_process().name
修改名字只能在start之前修改
也可以在p1=Process(target=f,name='')中修改

#创建对象的状态
p1=Process(target=f,name='') 初始状态
p1.start() 就绪状态
运行过程中,cpu可能会换走,变成就绪状态,等待获取cpu使用权
直到进程的功能函数运行完毕进程进入死亡状态

如果进程有 sleep和input 阻塞状态

p1.join() 是否等待进程实例执行结束,或等待多少秒
是主程序运行的

p1.terminate():不管任务是否完成,立即终止
主程序运行

 

进程间传递:

multiprocessing模块的Queue实现多进程之间的数据传递

apply_async(func[, args[, kwds]]) :使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程)

异步:一个任务不用等待其它任务执行完毕再执行,可以立刻开始,互相不影响。
po=Pool(3) #定义一个进程池,最大进程数3
for i in range(0,10):
#Pool.apply_async(要调用的目标,(传递给目标的参数元祖,))
#每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker,(i,))

同步:协同步调,按照一定的顺序执行。
po=Pool(3) #定义一个进程池,最大进程数3
for i in range(0,10):
po.apply(worker,(i,))

posted on 2018-08-23 16:55  五杀摇滚小拉夫  阅读(155)  评论(0编辑  收藏  举报