众所周知,多线程编程是一种可以提高整个任务性能的并行处理方式。多线程编程的主要特点有以下几个方面,本质上是异步的;需要多个并发活动;每个活动的处理顺序可能是不确定的,或者说是随机的、不可预测的。这种编程任务可以被组织或划分成多个执行流,其中每个执行流都有一个指定要完成的任务。根据应用的不同,这些子任务可能需要计算出中间结果,然后合并为最终的输出结果。在学习多线程的一个主要的误区就是,不要认为多线程就是计算机同时运行多个线程,实际上在程序运行的任意时间,只有一个线程会被解释器运行。
Python 提供了多个模块来支持多线程编程,包括 thread、threading 和 Queue 模块等。程序是可以使用 thread 和 threading 模块来创建与管理线程。thread模块提供了基本的线程和锁定支持;而threading模块提供了更高级别、功能更全面的线程管理。使用 Queue 模块,用户可以创建一个队列数据结构,用于在多线程之间进行共享。(PS:避免使用thread模块,应尽量使用更高级别的线程管理模块,如threading模块。不使用thread模块的一个主要原因是它对于子进程何时退出没有控制,一旦主进程结束,其它进程均强制退出。)在这里要引入一个新的概念,守护进程,如果一个进程被设置为守护进程,就表示这个进程不太重要,当主进程退出时不需要等待该进程执行完成。下面来举几个多线程的例子。
import threading
from time import ctime,sleep
class MyThread(threading.Thread):
def __init__(self,func,args,name=''):
threading.Thread.__init__(self)
self.name=name
self.func=func
self.args=args
def getResult(self):
return self.res
def run(self):
print 'starting',self.name,'at:',ctime()
self.res=self.func(*self.args)
print self.name,'finished at:',ctime()
该程序将多线程封装成MyThread类,以后使用时可直接调用。
from random import randint
from time import sleep
from Queue import Queue
from myThread import MyThread
def writeQ(queue):
print 'producing object for Q...',queue.put('xxx',1)
print "size now",queue.qsize()
def readQ(queue):
val=queue.get(1)
print 'CONSUMED object from Q... size now',queue.qsize()
def writer(queue,loops):
for i in range(loops):
writeQ(queue)
sleep(randint(1,3))
def reader(queue,loops):
for i in range(loops):
readQ(queue)
sleep(randint(2,5))
funcs=[writer,reader]
nfuncs=range(len(funcs))
def main():
nloops=randint(2,5)
q=Queue(32)
threads=[]
for i in nfuncs:
t=MyThread(funcs[i],(q,nloops),funcs[i].__name__)
threads.append(t)
for i in nfuncs:
threads[i].start()
for i in nfuncs:
threads[i].join()
print 'all done'
if __name__=='__main__':
main()
该例子调用MyThread实例,完成简单的函数调用。
我觉得里边的函数什么都不用记,如果以后要用到多线程的话,将这个框架做相应的修改就行了。
本人对计算机视觉比较感兴趣,有兴趣的大神可以多多交流。