python多线程编程
Posted starkbling
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python多线程编程相关的知识,希望对你有一定的参考价值。
python中能够用于操作多线程的模块分别有:Queue、_Thread、Threading,python中建议使用Threading模块来进行多线程操作。
使用thread模块来进行多线程运行:
import _thread from time import sleep, ctime loops = [4, 2,5] def loop(nloop, nsec, lock): print(‘start loop‘, nloop, ‘at:‘, ctime()) sleep(nsec) print(‘loop‘, nloop, ‘done at:‘, ctime()) lock.release() def main(): print(‘starting threads...‘) locks = [] nloops = list(range(len(loops))) for i in nloops: lock = _thread.allocate_lock() #分配锁 lock.acquire() #把锁锁上 locks.append(lock) #添加到锁列表 for i in nloops: _thread.start_new_thread(loop, (i, loops[i], locks[i])) for i in nloops: while locks[i].locked(): #循环检测,直到所有的子线程都运行完毕,主线程才会释放 sleep(0.2) print("waiting...") pass print(‘all DONE at:‘, ctime()) if __name__ == ‘__main__‘: main()
使用Threading进行多线程运行python程序:
import threading from time import sleep, ctime loops = [4, 2] class ThreadFunc(object): def __init__(self, func, args, name=‘‘): self.name = name self.func = func self.args = args def __call__(self): self.func(*self.args) def loop(nloop, nsec): print(‘start loop‘, nloop, ‘at:‘, ctime()) sleep(nsec) print(‘loop‘, nloop, ‘done at:‘, ctime()) def main(): print(‘starting at:‘, ctime()) threads = [] nloops = list(range(len(loops))) for i in nloops: # create all threads t = threading.Thread( target=ThreadFunc(loop, (i, loops[i]), loop.__name__)) #loop.__name__返回函数的名称 threads.append(t) for i in nloops: # start all threads threads[i].start() for i in nloops: # wait for completion threads[i].join() print(‘all DONE at:‘, ctime()) if __name__ == ‘__main__‘: main()
核心提示:守护线程
避免使用 thread 模块的另一个原因是该模块不支持守护线程这个概念。当主线程退出时,所有子线程都将终止,不管它们是否仍在工作。如果你不希望发生这种行为,就要引入守护线程的概念了。
threading 模块支持守护线程,其工作方式是:守护线程一般是一个等待客户端请求服务的服务器。如果没有客户端请求,守护线程就是空闲的。如果把一个线程设置为守护线程,就表示这个线程是不重要的,进程退出时不需要等待这个线程执行完成。如同在第 2 章中看到的那样,服务器线程远行在一个无限循环里,并且在正常情况下不会退出。如果主线程准备退出时,不需要等待某些子线程完成,就可以为这些子线程设置守护线程标记。该标记值为真时,表示该线程是不重要的,或者说该线程只是用来等待客户端请求而不做任何其他事情。
要将一个线程设置为守护线程,需要在启动线程之前执行如下赋值语句:thread.daemon = True(调用 thread.setDaemon(True)的旧方法已经弃用了)。同样,要检查线程的守护状态,也只需要检查这个值即可(对比过去调用 thread.isDaemon()的方法)。一个新的子线程会继承父线程的守护标记。整个 Python 程序(可以解读为:主线程)将在所有非守护线程退出之后才退出,换句话说,就是没有剩下存活的非守护线程时。
以上是关于python多线程编程的主要内容,如果未能解决你的问题,请参考以下文章