跳转至

🐙 Python多线程(二)

在Python多线程中:

  • join()方法的作用是线程同步1
  • 守护线程为守护其他线程而设立。被守护的主线程不存在后,守护线程自然消失。

壹丨多线程默认情况

默认情况下(setDaemon(False)),主线程执行完后立即退出,子线程继续执行直至结束。

import threading
from time import sleep


def threading_1():
    sleep(3)
    print('子线程1结束')


def threading_2():
    sleep(3)
    print('子线程2结束')


if __name__ == '__main__':
    t1 = threading.Thread(target=threading_1)
    t2 = threading.Thread(target=threading_2)
    t1.start()
    t2.start()

    print('主线程结束')

运行结果:

主线程结束
子线程2结束
子线程1结束

贰丨开启守护线程

为子线程开启守护线程(setDaemon(True)),当主线程结束时,子程序立马结束。

import threading
from time import sleep


def threading_1():
    sleep(3)
    print('子线程1结束')


def threading_2():
    sleep(10)
    print('子线程2结束')


if __name__ == '__main__':
    t1 = threading.Thread(target=threading_1)
    t1.start()

    t2 = threading.Thread(target=threading_2, daemon=True)
    t2.start()

    sleep(5)
    print('主线程结束')

Tips:t2.setDaemon(True)方法已弃用,直接在threading.Thread()中设置daemon属性。

运行结果:

子线程1结束
主线程结束

叁丨使用join方法设置同步

子线程使用join()方法后,主线程将被阻塞,直至子线程执行结束。将所有子线程放在一个列表依次使用join()方法,保证全部子线程能运行完成,主线程才退出。

import threading
from time import sleep


def threading_1():
    sleep(3)
    print('子线程1结束')


def threading_2():
    sleep(10)
    print('子线程2结束')


if __name__ == '__main__':
    threads = []
    t1 = threading.Thread(target=threading_1)
    threads.append(t1)
    t1.start()

    t2 = threading.Thread(target=threading_2, daemon=True)
    threads.append(t2)
    t2.start()

    [thread.join() for thread in threads]

    sleep(1)
    print('主线程结束')

运行结果:

子线程1结束
子线程2结束
主线程结束

肆丨不设置守护但对join()设置超时

join()方法添加timeout参数,主线程对每个子线程的等待时间不大于timeout

import threading
from time import sleep


def threading_1():
    sleep(3)
    print('子线程1结束')


def threading_2():
    sleep(10)
    print('子线程2结束')


if __name__ == '__main__':
    threads = []
    t1 = threading.Thread(target=threading_1)
    threads.append(t1)
    t1.start()

    t2 = threading.Thread(target=threading_2, daemon=False)
    threads.append(t2)
    t2.start()

    [thread.join(5) for thread in threads]

    sleep(1)
    print('主线程结束')

运行结果:

子线程1结束
主线程结束
子线程2结束

***Tips:***主线程在子线程未执行结束就开始执行。由于未设置守护,子线程2会执行至结束。

伍丨开启守护并对join()设置超时

为子线程2添加守护,并设置join()超时。子线程2未在限定时间内执行结束,会被直接终止。

import threading
from time import sleep


def threading_1():
    sleep(3)
    print('子线程1结束')


def threading_2():
    sleep(10)
    print('子线程2结束')


if __name__ == '__main__':
    threads = []
    t1 = threading.Thread(target=threading_1)
    threads.append(t1)
    t1.start()

    t2 = threading.Thread(target=threading_2, daemon=True)
    threads.append(t2)
    t2.start()

    [thread.join(5) for thread in threads]

    sleep(1)
    print('主线程结束')

运行结果:

子线程1结束
主线程结束

  1. CSDN,@玖艺东哥,Python 多线程中的join用法