当前位置 > it书童 > 知识体系 > 正文

控制线程

知识体系 it书童 2019-10-03 22:07:26 0赞 0踩 210阅读 0评论

join 线程

当某个程序执行流中调用其他线程的 join() 方法时,调用线程被将阻塞,直到被 join() 方法加入的 join 线程执行完成

join_thread.py

import threading


def action(max):
    for i in range(max):
        print(threading.current_thread().name + " " + str(i))


threading.Thread(target=action, args=(5,), name="新线程").start()
for i in range(5):
    if i == 2:
        jt = threading.Thread(target=action, args=(5,), name='被 Join 的线程')
        jt.start()
        # 主线程调用了 jt 线程的 join() 方法,主线程必须等 jt 执行结束才会向下执行
        jt.join()
    print(threading.current_thread().name + " " + str(i))
☁  crazy_python  python join_thread.py
新线程 0
MainThread 0
新线程 1
MainThread 1
新线程 2
新线程 3
被 Join 的线程 0
新线程 4
被 Join 的线程 1
被 Join 的线程 2
被 Join 的线程 3
被 Join 的线程 4
MainThread 2
MainThread 3
MainThread 4

当主线程执行到 i == 2 时,程序启动并 join 了名为 `被 Join 的线程" 的线程,主线程将一直处于阻塞状态,直到被 join 的线程执行完成

后台线程

为其他线程提供服务,在后台运行的线程被称为后台线程(Daemon Thread),又称为守护线程。Python 解释器的垃圾回收线程就是典型的后台线程

后台线程的特征:如果所有的前台线程都死亡了,后台线程会自动死亡

调用 Thread 对象的 daemon 属性可以将指定线程设置成后台线程

daemon_thread.py

import threading


def action(max):
    # 定义后台线程的执行体与普通线程无区别
    for i in range(max):
        print(threading.current_thread().name + " " + str(i))


t = threading.Thread(target=action, args=(5,), name='后台线程')
# 将此线程设置为后台线程
# 也可在创建时通过 daemon 参数将其设为后台线程
t.daemon = True
# 启动后台线程
t.start()
for i in range(10):
    print(threading.current_thread().name + " " + str(i))

当前台线程死亡后,Python 解释器会通知后台线程死亡,但从它接收指令到做出响应需要一定的时间。如果要将某个线程设置为后台线程,必须在该线程启动前进行设置。否则会引发 RuntimeError 异常

线程睡眠

在当前线程调用 sleep() 进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,即使系统中没有其他可执行的线程

sleep_test.py

import time
for i in range(10):
    print('当前时间:%s' % time.ctime())
    time.sleep(1)
转载须注明出处:https://www.itshutong.com/articles/23/control-thread
关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
发表评论
我有句话,不知当讲不当讲?
要讲之前请先 登录