多线程和多进程

一、多线程

在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:等所有进程结束后关闭进程池

 

posted @ 2019-01-21 16:22  小小小小小码农  阅读(154)  评论(0编辑  收藏  举报