进程与线程
进程:程序的一次执行,程序装载内存,系统分配资源数据栈等;
线程:每个进程都有入口,出口,有优先级,资源争抢
GIL全局解释器锁
GLobal Interpreter Lock,GIL并不是Python的特性,是实现CPython时引入的一个概念
GIL是一把全局排它锁,同一时间只有一个线程在运行,这造成了Python几乎等于是单线程执行的程序
mutiprocessing库是为了弥补thread库因为GIL而低效的的缺陷,每一个进程都有自己独立的GIL,每一个都是一个进程而不是线程
from multiprocessing import Process
import time
def f(n):time.sleep(1)print n*n
if __name__=='__main__':for i in range(10):p=Process(target=f,args=[i,])p.start()
做并发的时候效率比较高
threading模块使用
import time
import threading
def f1():pass
def f2(arg1,arg2):time.sleep(1)print('正在执行.....')print(arg1+arg2)f1()
thr=threading.Thread(target=f2,args=(111,222))
thr.start()thr.setDaemon(True)
thr.join(2)
其中,setDaemon(True)方法里的参数设置成True则是主线程不用等待子线程,主线程结束之后就将子线程结束掉,也称为守护线程,而join(5)是等待线程,主线程等待子线程,子线程结束之后主线程才能执行,等待的最大的时间就是给定的参数。
threading.currentThread()返回当前的线程变量
threading.enumerate()返回正在运行的线程的list
threading.activeCount()返回正在运行线程的数量,与len(threading.enumerate())的结果一致
threading模块提供的类:
Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local.
thread(group=None,target=None,name=None,args=(,),kwargs={})
thread.isAlive()
thread.setName()
thread.start()
thread.setDaemon()
thread.join()
多线程的event事件
import time
import threading
def do(event):print('start')event.wait()print('ending')
event_org=threading.Event()
for i in range(10):thr=threading.Thread(target=do,args=[event_org,])thr.start()
event_org.clear()
inp=input('请输入:')
if inp=='True':event_org.set()
threading.Event()的event事件的方法有
event_org.wait() 事件等待。
event_org.set()将事件设置成True,即是事件的开始。
event_org.clear()将事件停止参数设置成,False
event_org.isSet(True),默认是True,要是设置成False将其改成False就好
?????fork操作,调用一次返回两次?????疑问
进程间通信Queue
Queue是进程安全的队列