三者同样是为了提高执行的效率,利用等待的时间执行更多的操作
1.线程 import threading
建立一个执行的对象
td1 = threading.Thread(target=saySorry,args=(g_nums,),name='小明') #target需要传的就是要执行的那个函数,args用来传参数但记住一定是个元组,name是给这个线程命名,可以不写,系统会自动生成一个名字 threading.current_thread().name方法可以查看当前线程名称
td1.start() #启动线程,即让线程开始执行
td1.join()#这个方法可以是指定的线程等待,即主线程等待子线程执行完成,在开始执行
线程是可以共享全局变量的,但是为了防止数据紊乱,通常会使用lock锁,但是一定要注意死锁,即线程之间相互等待的问题
# 创建锁
mutex = threading.Lock()
# 锁定
mutex.acquire()
# 释放
mutex.release()
2.进程 一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。
不仅可以通过线程完成多任务,进程也是可以的
进程状态:
就绪态:运行的条件都已经慢去,正在等在cpu执行
执行态:cpu正在执行其功能
等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态
from multiprocessing import Process
创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动
p = Process(target=run_proc)
p.start()
这是其他的一些参数:
target:如果传递了函数的引用,可以任务这个子进程就执行这里的代码
args:给target指定的函数传递的参数,以元组的方式传递
kwargs:给target指定的函数传递命名参数
name:给进程设定一个名字,可以不设定
group:指定进程组,大多数情况下用不到
方法:
start():启动子进程实例(创建子进程)
is_alive():判断进程子进程是否还在活着
join([timeout]):是否等待子进程执行结束,或等待多少秒
terminate():不管任务是否完成,立即终止子进程
进程之间是不会共享全局变量的,及时在另一个进程之间改变了全局变量的值,在其他进程访问的时候这个值还是没有改变的
但是有时候是互相需要通信该怎么办呢,需要用队列Queue
# from multiprocessing import Queue
方法
Queue.qsize() 返回队列的大小
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False
Queue.full 与 maxsize 大小对应
Queue.get([block[, timeout]])获取队列,timeout等待时间
import Queue
myqueue = Queue.Queue(maxsize = 10)
将一个值放入队列中
myqueue.put(10)
将一个值从队列中取出
myqueue.get()