码迷,mamicode.com
首页 > 编程语言 > 详细

python多线程编程

时间:2018-09-13 16:31:49      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:无限循环   while   daemon   lock   rgs   sel   程序   启动   span   

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多线程编程

标签:无限循环   while   daemon   lock   rgs   sel   程序   启动   span   

原文地址:https://www.cnblogs.com/starkbling/p/9640502.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!