Python线程/进程-join

目录

1、默认创建线程,不使用 join时

2、创建线程,设置守护线程,不使用join

3、默认创建线程,使用join

4、创建线程,设置守护线程,使用join

5、默认创建线程,使用join,并设置timeout时间

6、创建线程,设置守护线程,使用join,并设置timeout时间


1、默认创建线程,不使用 join时

import threading
import time


def task1():
    print('task--1---starting')
    time.sleep(2)
    print('task--1---end')


def task2():
    print('task--2---starting')
    time.sleep(5)
    print('task--2---end')


t1 = threading.Thread(target=task1)
t2 = threading.Thread(target=task2)
print(f'当前线程数量={len(threading.enumerate())},线程={threading.enumerate()}')
t1.start()
print(f't1启动后,当前线程数量={len(threading.enumerate())},线程={threading.enumerate()}')
t2.start()
print(f't2启动后,当前线程数量={len(threading.enumerate())},线程={threading.enumerate()}')
print('main-thread-go')
print(f'主线程运行到代码最后,当前线程数量={len(threading.enumerate())},线程={threading.enumerate()}')
D:\pycharm_workspace\Demo\venv\Scripts\python.exe D:/pycharm_workspace/Demo/main.py
当前线程数量=1,线程=[<_MainThread(MainThread, started 24136)>]
task--1---starting
t1启动后,当前线程数量=2,线程=[<_MainThread(MainThread, started 24136)>, <Thread(Thread-1, started 6740)>]
task--2---startingt2启动后,当前线程数量=3,线程=[<_MainThread(MainThread, started 24136)>, <Thread(Thread-1, started 6740)>, <Thread(Thread-2, started 20996)>]
main-thread-end

主线程运行到代码最后,当前线程数量=3,线程=[<_MainThread(MainThread, started 24136)>, <Thread(Thread-1, started 6740)>, <Thread(Thread-2, started 20996)>]
task--1---end
task--2---end

Process finished with exit code 0

默认情况,setDaemon的值是False,表示非守护线程。

当主线程运行到代码最后,会等待子线程运行,当子线程运行完成后,子线程会自动结束,再结束主线程

2、创建线程,设置守护线程,不使用join

import threading
import time


def task1():
    print('task--1---starting')
    time.sleep(2)
    print('task--1---end')


def task2():
    print('task--2---starting')
    time.sleep(5)
    print('task--2---end')


t1 = threading.Thread(target=task1)
t2 = threading.Thread(target=task2)
print(f'当前线程数量={len(threading.enumerate())},线程={threading.enumerate()}')
t1.setDaemon(True)  # 设置守护线程
t1.start()
print(f't1启动后,当前线程数量={len(threading.enumerate())},线程={threading.enumerate()}')
t2.setDaemon(True)  # 设置守护线程
t2.start()
print(f't2启动后,当前线程数量={len(threading.enumerate())},线程={threading.enumerate()}')
print('main-thread-go')
print(f'主线程运行到代码最后,当前线程数量={len(threading.enumerate())},线程={threading.enumerate()}')
D:\pycharm_workspace\Demo\venv\Scripts\python.exe D:/pycharm_workspace/Demo/main.py
当前线程数量=1,线程=[<_MainThread(MainThread, started 5224)>]
task--1---startingt1启动后,当前线程数量=2,线程=[<_MainThread(MainThread, started 5224)>, <Thread(Thread-1, started daemon 20688)>]

task--2---startingt2启动后,当前线程数量=3,线程=[<_MainThread(MainThread, started 5224)>, <Thread(Thread-1, started daemon 20688)>, <Thread(Thread-2, started daemon 9644)>]

main-thread-go
主线程运行到代码最后,当前线程数量=3,线程=[<_MainThread(MainThread, started 5224)>, <Thread(Thread-1, started daemon 20688)>, <Thread(Thread-2, started daemon 9644)>]

Process finished with exit code 0

【守护线程,是为守护别人而存在,当设置为守护线程后,被守护的主线程不存在后,守护线程也自然不存在】

主线程运行,当运行到代码最后,因为子线程有设置延时,不会立刻执行完成,并且因为子线程设置了守护线程,所以主线程运行到最后结束后,子线程没执行完,也立刻结束

3、默认创建线程,使用join

import threading
import time


def task1():
    print('task--1---starting', time.strftime('%H:%M:%S'))
    time.sleep(2)
    print('task--1---end', time.strftime('%H:%M:%S'))


def task2():
    print('task--2---starting', time.strftime('%H:%M:%S'))
    time.sleep(5)
    print('task--2---end', time.strftime('%H:%M:%S'))


t1 = threading.Thread(target=task1)
t2 = threading.Thread(target=task2)

t1.start()
t2.start()

t1.join()
print(time.strftime('%H:%M:%S'))
t2.join()
print(time.strftime('%H:%M:%S'))
print('main-thread-go')

D:\pycharm_workspace\Demo\venv\Scripts\python.exe D:/pycharm_workspace/Demo/main.py
task--1---starting 17:23:53
task--2---starting 17:23:53
task--1---end 17:23:55
17:23:55
task--2---end 17:23:58
17:23:58
main-thread-go

Process finished with exit code 0

主线程运行到start会启动子线程,然后子线程并发运行,当主线程运行到join,主线程阻塞,并不影响子线程,子线程继续并发运行,主线程会一直等待调用join的子线程执行完后,继续向下执行。

4、创建线程,设置守护线程,使用join

import threading
import time


def task1():
    print('task--1---starting', time.strftime('%H:%M:%S'))
    time.sleep(2)
    print('task--1---end', time.strftime('%H:%M:%S'))


def task2():
    print('task--2---starting', time.strftime('%H:%M:%S'))
    time.sleep(5)
    print('task--2---end', time.strftime('%H:%M:%S'))


t1 = threading.Thread(target=task1)
t2 = threading.Thread(target=task2)

t1.setDaemon(True)
t1.setDaemon(True)
t1.start()
t2.start()

t1.join()
print(time.strftime('%H:%M:%S'))
t2.join()
print(time.strftime('%H:%M:%S'))
print('main-thread-go')

D:\pycharm_workspace\Demo\venv\Scripts\python.exe D:/pycharm_workspace/Demo/main.py
task--1---starting 17:35:54
task--2---starting 17:35:54
task--1---end 17:35:56
17:35:56
task--2---end 17:35:59
17:35:59
main-thread-go

Process finished with exit code 0

此例运行结果同3一样

5、默认创建线程,使用join,并设置timeout时间

import threading
import time


def task1():
    print('task--1---starting', time.strftime('%H:%M:%S'))
    time.sleep(2)
    print('task--1---end', time.strftime('%H:%M:%S'))


def task2():
    print('task--2---starting', time.strftime('%H:%M:%S'))
    time.sleep(5)
    print('task--2---end', time.strftime('%H:%M:%S'))


t1 = threading.Thread(target=task1)
t2 = threading.Thread(target=task2)

t1.start()
t2.start()

t1.join(3)
print(time.strftime('%H:%M:%S'))
t2.join(1)
print(time.strftime('%H:%M:%S'))
print('main-thread-go')

D:\pycharm_workspace\Demo\venv\Scripts\python.exe D:/pycharm_workspace/Demo/main.py
task--1---starting 17:48:02
task--2---starting 17:48:02
task--1---end 17:48:04
17:48:04
17:48:05
main-thread-go
task--2---end 17:48:07

Process finished with exit code 0

当运行到 t1.join(3),主线程阻塞,因为t1只休眠了2秒(虽然join设置了3,但这里实际只会阻塞主线程2秒),所以2秒后t1执行完后,主线程继续向下运行,t2.join(1),因为t2休眠5秒,join(1)秒并不能执行完,所以1秒后,主线程继续向下执行,一直到代码最后。又因没有设置守护进行,所以会等待子线程执行结束,前面已经休眠了3秒,所以t2继续运行2秒后,执行结束

6、创建线程,设置守护线程,使用join,并设置timeout时间

import threading
import time


def task1():
    print('task--1---starting', time.strftime('%H:%M:%S'))
    time.sleep(2)
    print('task--1---end', time.strftime('%H:%M:%S'))


def task2():
    print('task--2---starting', time.strftime('%H:%M:%S'))
    time.sleep(5)
    print('task--2---end', time.strftime('%H:%M:%S'))


t1 = threading.Thread(target=task1)
t2 = threading.Thread(target=task2)

t1.setDaemon(True)
t2.setDaemon(True)
t1.start()
t2.start()

t1.join(3)
print(time.strftime('%H:%M:%S'))
t2.join(1)
print(time.strftime('%H:%M:%S'))
print('main-thread-go')

D:\pycharm_workspace\Demo\venv\Scripts\python.exe D:/pycharm_workspace/Demo/main.py
task--1---starting 17:58:04
task--2---starting 17:58:04
task--1---end 17:58:06
17:58:06
17:58:07
main-thread-go

Process finished with exit code 0

当运行到 t1.join(3),主线程阻塞,因为t1只休眠了2秒(虽然join设置了3,但这里实际只会阻塞主线程2秒),所以2秒后t1执行完后,主线程继续向下运行,t2.join(1),因为t2休眠5秒,join(1)秒并不能执行完,所以1秒后,主线程继续向下执行,一直到代码最后。又因设置守护进行,主线程直接结束,子线程也一起结束,但由于t2休眠5秒,所以这里t2没执行完就直接结束了,所以没有打印出task--2--end

 1、python 默认参数创建线程后,不管主线程是否执行完毕,都会等待子线程执行完毕才一起退出,有无join结果一样

2、如果创建线程,并且设置了daemon为true,即thread.setDaemon(True), 则主线程执行完毕后自动退出,不会等待子线程的执行结果。而且随着主线程退出,子线程也消亡。

3、如果线程daemon属性为False, 则join里的timeout参数无效。主线程会一直等待子线程结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值