python并发编程之多进程、多线程、异步和协程详解并发编程之多进程、多线程、异步和协程详解
最近学习python并发,于是对多进程、多线程、异步和协程做了个总结。
一、多线程一、多线程
多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活状态,从而让多个函数的操作同时运行。即使是单
CPU的计算机,也可以通过不停地在不同线程的指令间切换,从而造成多线程同时运行的效果。
多线程相当于一个并发(concunrrency)系统。并发系统一般同时执行多个任务。如果多个任务可以共享资源,特别是同时写入
某个变量的时候,就需要解决同步的问题,比如多线程火车售票系统:两个指令,一个指令检查票是否卖完,另一个指令,多
个窗口同时卖票,可能出现卖出不存在的票。
在并发情况下,指令执行的先后顺序由内核决定。同一个线程内部,指令按照先后顺序执行,但不同线程之间的指令很难说清
除哪一个会先执行。因此要考虑多线程同步的问题。同步(synchronization)是指在一定的时间内只允许某一个线程访问某个资
源。
1、、thread模块模块
2、、threading模块模块
threading.Thread 创建一个线程。
给判断是否有余票和卖票,加上互斥锁,这样就不会造成一个线程刚判断没有余票,而另外一个线程就执行卖票操作。
#! /usr/bin/python
#-* coding: utf-8 -*
# __author__ ="tyomcat"
import threading
import time
import os
def booth(tid):
global i
global lock
while True:
lock.acquire()
if i!=0:
i=i-1
print "窗口:",tid,",剩余票数:",i
time.sleep(1)
else:
print "Thread_id",tid,"No more tickets"
os._exit(0)
lock.release()
time.sleep(1)
i = 100
lock=threading.Lock()
for k in range(10):
new_thread = threading.Thread(target=booth,args=(k,))
new_thread.start()
二、协程(又称微线程,纤程)二、协程(又称微线程,纤程)
协程,与线程的抢占式调度不同,它是协作式调度。协程也是单线程,但是它能让原来要使用异步+回调方式写的非人类代码,
可以用看似同步的方式写出来。
1、协程在python中可以由生成器(generator)来实现。
首先要对生成器和yield有一个扎实的理解.
调用一个普通的python函数,一般是从函数的第一行代码开始执行,结束于return语句、异常或者函数执行(也可以认为是隐
式地返回了None)。
一旦函数将控制权交还给调用者,就意味着全部结束。而有时可以创建能产生一个序列的函数,来“保存自己的工作”,这就是
生成器(使用了yield关键字的函数)。
能够“产生一个序列”是因为函数并没有像通常意义那样返回。return隐含的意思是函数正将执行代码的控制权返回给函数被调
用的地方。而”yield”的隐含意思是控制权的转移是临时和自愿的,我们的函数将来还会收回控制权。