Python多线程编程之线程结束

在线程管理中创建线程;启动一个线程;线程睡眠包括等待线程结束和线程停止。
线程创建;共启和卧铺睡眠之前已经提到过,这里不再重复。

等待1个线程完成

等待线程完成Join()方法当t1线程的join()方法被当前线程调用时。
它阻塞并等待当前进程。
t1结束线程。
如果t1线程完成或等待时间到期。
当前线程返回活动状态并继续处理。
join()方法的语法如下:

join(timeout=None)

参数timeout是设置超时时间,单位是s。
如果时间未到,当一个线程依赖于另一个线程的执行结果时,你可以永远等待。
你可以调用另一个线程的Join()方法并等待它完成运行...')shared_value+=1time.sleep(1)print('ThreadA完成...')defmain():print('主线程。
开始...')t1=threading.Thread(target=thread_body,name='ThreadA')t1.start()print('主线程被阻塞...')t1.join()print(f'value={shared_value}')print('主线程继续...')

结果:

主线程启动...ThreadA启动...主线程阻塞停止。
..线程A正在运行...ThreadA正在运行...ThreadA正在运行...ThreadA正在运行...ThreadA正在运行.....ThreadA已完成...value=5继续主线程。
execute...

这里定义了共享变量shared_value,该变量固定在批处理体中。
在main函数中调用t1的join()方法会导致主线程阻塞,等待线程t1完成执行后再继续主线程。
在评估结果时;父线程丢失并被阻塞。
打印的shared_value值从0变为5

2个线程停止

对于一些复杂的操作,需要设置线程停止变量来确定线程停止变量。
例如,我有一个捕获数据的系统,每半小时运行一次数据捕获。
数据捕获操作一般在子会话中执行,并在处理前休眠一段时间。
这条线索在中国将会有一条无尽的链条。
要停止子线程,应设置线程停止变量

例如:

importthreadingimporttimeis_running=Truedefthread_body():whileis_running:print('ThreadAstarts...')#数据捕获任务print('ThreadAisrunning...')time.sleep(1)print('ThreadA完成...')print('整个程序已执行')defmain():print('主线程开始...')t1=threading.Thread(target=thread_body)t1.start()command=input('请输入停止命令:')ifcommand=='exit':globalis_runningis_running=Falseif__name__=='__main__':main()

结果:

主线程启动....ThreadA启动...ThreadA正在运行...请停止命令类型:exitThreadAfinish...整个程序执行完毕

这里设置了ThreadAStop变量is_running;原来的当用户通过键盘访问控制台上的输出时它的值更改为False并且程序终止。
请注意,在控制台上输入exit后仍然需要按Enter键。

Python中Thread类的start和run方法的区别

1)start:使用start方法启动线程,真正实现多线程运行,此时不需要等待run方法的核心代码执行完毕,直接继续执行下一段代码。
通过调用Thread类的start()方法来启动一个线程。
此时线程处于就绪(可运行)状态,并未运行。
一旦获得CPU时间片,run()方法就会启动。
这里的run()方法称为线程,包含了要执行的线程的内容。
当run方法结束时,线程立即结束。
2)Run:run()方法只是类的常规方法。
如果直接调用run方法,程序中仍然只有一个线程,就是主线程,程序执行路径仍然只有一条。
还是要串行执行,或者说还是要等待run方法,而后面的代码只能在脚本执行完毕后继续执行,这样就没有达到写线程的目的。
总结:调用start方法就可以启动一个线程,而run方法只是调用该线程的一个普通方法,仍然在主线程中执行。
这两种方法大家应该很熟悉了。
将需要并行处理的代码放入run()方法中,run()方法启动的线程会自动调用jvm内存机制提供的run()方法。
run()方法必须具有公共访问权限,并且返回值类型为null。

python如何中断线程?

使用Python的thread模块创建和管理线程时,可以使用各种方法来终止线程,但要避免直接调用Thread.terminate()或os._exit()等强制线程终止的函数。
正确终止线程可能会导致泄漏和不一致的数据。
中断序列的具体方法是:1.使用标志或信号量:设置一个全局标志或信号量,线程在执行过程中会检查该标志。
顺序控制是通过线程间通信来完成的。
2.使用螺纹。
事件对象:创建一个事件对象,线程在执行过程中调用wait()方法来检查事件是否被触发。
当使用执行时序列结束。
通过事件处理可以轻松实现线程之间的同步。
3、使用threading.Condition对象:创建一个Condition对象,当线程等待条件执行完毕后,调用wait()方法。
当满足条件或接收到信号时,序列继续执行。
这些条件适用于多线程需要同步的场景。
4、使用线程池中的工作线程:通过控制程池中工作的线程数量,当达到预期数量时,拒绝额外线程的请求,从而中断线程的执行。
通过这些方法,可以更加安全高效地中断Python中的线程。
在实现中,需要根据具体需要选择合适的方法,合理设计线程之间的通信和控制机制。