python多线程编程
2021-06-30 17:06
标签:无限循环 while daemon lock rgs sel 程序 启动 span python中能够用于操作多线程的模块分别有:Queue、_Thread、Threading,python中建议使用Threading模块来进行多线程操作。 使用thread模块来进行多线程运行: 使用Threading进行多线程运行python程序: 核心提示:守护线程 threading 模块支持守护线程,其工作方式是:守护线程一般是一个等待客户端请求服务的服务器。如果没有客户端请求,守护线程就是空闲的。如果把一个线程设置为守护线程,就表示这个线程是不重要的,进程退出时不需要等待这个线程执行完成。如同在第 2 章中看到的那样,服务器线程远行在一个无限循环里,并且在正常情况下不会退出。如果主线程准备退出时,不需要等待某些子线程完成,就可以为这些子线程设置守护线程标记。该标记值为真时,表示该线程是不重要的,或者说该线程只是用来等待客户端请求而不做任何其他事情。 要将一个线程设置为守护线程,需要在启动线程之前执行如下赋值语句:thread.daemon = True(调用 thread.setDaemon(True)的旧方法已经弃用了)。同样,要检查线程的守护状态,也只需要检查这个值即可(对比过去调用 thread.isDaemon()的方法)。一个新的子线程会继承父线程的守护标记。整个 Python 程序(可以解读为:主线程)将在所有非守护线程退出之后才退出,换句话说,就是没有剩下存活的非守护线程时。
python多线程编程 标签:无限循环 while daemon lock rgs sel 程序 启动 span 原文地址:https://www.cnblogs.com/starkbling/p/9640502.htmlimport _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()
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 模块的另一个原因是该模块不支持守护线程这个概念。当主线程退出时,所有子线程都将终止,不管它们是否仍在工作。如果你不希望发生这种行为,就要引入守护线程的概念了。