多线程和多进程
一、多线程
在python中,多线程库为threading.
创建一个线程对象
import threading as td import time def countnum(n): print("running on number:%s"%n) time.sleep(3) if __name__=='__main__': t1=td.Thread(target=countnum,args=(23,)) #函数不能加括号,args参数只有一个时后面要加逗号 t2= td.Thread(target=countnum, args=(14,)) t1.start() t2.start() print("ending")
Thread实例对象的方法:
isAlive() #返回线程是否活动
getName() #返回线程名
setName() #设置线程名
threading模块提供的一些方法:
threading.currentThread() #返回当前的线程变量
threading.enumerate() #返回一个包含正在运行的线程的list
threading.activateCount() #返回正在运行的线程数量
无论有多少个CPU,python在执行一个进程时,同一时刻只能允许一个线程运行。
因此Python无法利用多核cpu实现多线程。
同步锁(Lock)
锁通常被用来实现对共享资源的同步访问。为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁,则当前线程需等待其被释放),待资源访问完后,再调用release方法释放锁:
import threading R=threading.Lock() R.acquire() ''' 公共数据的操作 ''' R.release()
队列
import queue q=queue.Queue(maxsize=10) #若小于1,则队列长度无限 q.put(10) #调用队列对象的put()方法在对尾插入一个项目 q.get() #调用队列对象的get()方法从队头删除并返回一个项目 q.task_done() #表示某个任务完成,每一条get语句后需要一条task_done q.join() #阻塞进程,直到所有任务完成.即等到队列为空时,再执行别的操作 q.qsize() #返回队列大小 q.empty() #当队列为空时返回True q.full() #当队列为满时返回True
python的queue模块中有三种队列即构造函数
FIFO(先进先出),LIFO(先进后出),PriorityQueue优先级队列
二、多进程
multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同名类一致。
进程池
进程池内部维护一个进程序列,当使用时,去进程池中获取一个进程,如果进程池序列中没有可供使用的进程,那么程序就会等待,直到进程池中有可用进程为止。
进程池的几个重要方法:
apply:从进程池中取一个进程并执行
apply_async:apply的异步版本(推荐,尽量少用apply,而多用apply_async)
terminate:立刻关掉线程池
join:主程序等待所有子程序执行完毕
close:等所有进程结束后关闭进程池