相关文章推荐
不要命的菠萝  ·  book save ...·  4 月前    · 
飞奔的铁板烧  ·  Kotlin Sequence ...·  1 年前    · 

对于程序来说,如果主进程在子进程还未结束时就已经退出,那么Linux内核会将子进程的父进程ID改为1(也就是init进程),当子进程结束后会由init进程来回收该子进程。

主线程退出后子线程的状态依赖于它所在的进程,如果进程没有退出的话子线程依然正常运转。如果进程退出了,那么它所有的线程都会退出,所以子线程也就退出了。
主线程退出,进程等待所有子线程执行完毕后才结束

进程启动后会默认产生一个主线程,默认情况下主线程创建的子线程都不是守护线程(setDaemon(False))。因此主线程结束后,子线程会继续执行,进程会等待所有子线程执行完毕后才结束

所有线程共享一个终端输出(线程所属进程的终端)

import threading
import time
def child_thread1():
    for i in range(100):
        time.sleep(1)
        print('child_thread1_running...')
def parent_thread():
    print('parent_thread_running...')
    thread1 = threading.Thread(target=child_thread1)
    thread1.start()
    print('parent_thread_exit...')
if __name__ == "__main__":
    parent_thread()
parent_thread_running...
parent_thread_exit...
child_thread1_running...
child_thread1_running...
child_thread1_running...
child_thread1_running...
...

可见父线程结束后,子线程仍在运行,此时结束进程,子线程才会被终止
主线程结束后进程不等待守护线程完成,立即结束

当设置一个线程为守护线程时,此线程所属进程不会等待此线程运行结束,进程将立即结束

遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! import threading import time def child_thread1(): for i in range(100): time.sleep(1) print('child_thread1_running...') def child_thread2(): for i in range(5): time.sleep(1) print('child_thread2_running...') def parent_thread(): print('parent_thread_running...') thread1 = threading.Thread(target=child_thread1) thread2 = threading.Thread(target=child_thread2) thread1.setDaemon(True) thread1.start() thread2.start() print('parent_thread_exit...') if __name__ == "__main__": parent_thread()
parent_thread_running...
parent_thread_exit...
child_thread1_running...child_thread2_running...
child_thread1_running...child_thread2_running...
child_thread1_running...child_thread2_running...
child_thread1_running...child_thread2_running...
child_thread2_running...child_thread1_running...
Process finished with exit code 0

thread1是守护线程,thread2非守护线程,因此,进程会等待thread2完成后结束,而不会等待thread1完成

注意:子线程会继承父线程中daemon的值,即守护线程开启的子线程仍是守护线程
主线程等待子线程完成后结束

在线程A中使用B.join()表示线程A在调用join()处被阻塞,且要等待线程B的完成才能继续执行

遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! import threading import time def child_thread1(): for i in range(10): time.sleep(1) print('child_thread1_running...') def child_thread2(): for i in range(5): time.sleep(1) print('child_thread2_running...') def parent_thread(): print('parent_thread_running...') thread1 = threading.Thread(target=child_thread1) thread2 = threading.Thread(target=child_thread2) thread1.setDaemon(True) thread2.setDaemon(True) thread1.start() thread2.start() thread2.join() 1/0 thread1.join() print('parent_thread_exit...') if __name__ == "__main__": parent_thread()
parent_thread_running...
child_thread1_running...
child_thread2_running...
child_thread1_running...
child_thread2_running...
child_thread1_running...
child_thread2_running...
child_thread1_running...
child_thread2_running...
child_thread1_running...
child_thread2_running...
Traceback (most recent call last):
  File "E:/test_thread.py", line 31, in <module>
    parent_thread()
  File "E:/test_thread.py", line 25, in parent_thread
    1/0
ZeroDivisionError: integer division or modulo by zero

主线程在执行到thread2.join()时被阻塞,等待thread2结束后才会执行下一句

1/0 会使主线程报错退出,且thread1设置了daemon=True,因此主线程意外退出时thread1也会立即结束。thread1.join()没有被主线程执行

原文链接:https://www.jianshu.com/u/8f2987e2f9fb Python学习之路,点击有全套Python笔记 进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所有进程间数据不共享,开销大。 线程: cpu调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在,一个进程至少有一个线程,叫线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率。 线程的运行是没有先后顺序的 子线程全部结束线程才会结束 Python会自动为线程指定一个名字 import threading import time def test1(): for i in python中用多线程+并发跑百万次任务贼快 Python中使用线程有两种方式:函数或者用类来包装线程对象。 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程。语法如下: _thread.start_new_thread ( function, args[, kwargs] ) 参数说明: function - 线程函数。 args - 传递给线程函数的参数,他必须是个tuple类型。 kwargs - 可选参数。 # -*- coding:utf-8 -*- 线程等待所有子线程结束的4种方法,包括使用`CountDownLatch`、`CyclicBarrier`、`Future.get()`、`Completable.allOf()`。 全局解释器锁(GTL):python代码的执行是由python虚拟机进行控制, 在循环中只能有一个控制线程在执行 一个进程的独立运行片段,一个进程里面可以有多个线程线程之间的执行顺序是无序的 一个进程的多个线程间共享数据,和上下文运行环境 线程随着时间线轮转 启动多线程后本体程序作为线程存在 每个子线程都是独立的个体 相互跟其他子线程平行 线程可以先运行完毕,等待子线程结束后 清理内存 等待时间不影响子线程的运行 子线程使用join()来阻塞线程(这样跟单线程有啥区别) 多线程的全局变量是共享的会出现资源抢夺问题 解决资源抢夺需要上互斥锁 单线程执行顺序 这篇文章要介绍了python线程与子线程结束顺序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 这篇文章要介绍了python线程与子线程结束顺序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 引用自 线程退出对子线程的影响 的一段话: 对于程序来说,如果进程在子进... 由于每个线程互相独立,相互之间没有任何关系,你干你的,我干我的,互相不干扰。 如果要几个线程同时干一件事怎么办,由于互相不走动,如果一个线程已经做过了,另一个线程再去做,不就重复了吗,很容易乱套。 现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,然后将num加1。很容易写出这样的代码:    蓝桥杯省赛之后不到一个月就是国赛了,我先给大家分享到这里,小伙伴们可以先关注收藏然后后续有需要可以再来看看哦,点击下面的文字,就可以查看你想要的内容,资源免费获取!(哦,对了也有的小伙伴选择省赛国赛一起准备哦~)(持续更新中…) 1、蓝桥杯比赛 单片机组 第十届国赛题目解答 2、蓝桥杯比赛 单片机组 第九届国赛题目解答 除此之外,有需要的小伙伴可以随时私信我,讨论学习过程中的问题,我会尽我所能提供一些帮助的 def _async_raise(tid, exctype): """raises the exception, performs cleanup if needed""" tid = ctypes.c_long(tid) if not inspect.is threading模块是Python里面常用的线程模块,多线程处理任务对于提升效率非常重要,先说一下线程和进程的各种区别,如图概括起来就是IO密集型(不用CPU)多线程计算密集型(用CPU)多进程使用线程和进程的目的都是为了提升效率(1)单进程单线程进程、线程(2)自定义线程进程线程线程2、threading模块可以创建多个线程,不过由于GIL锁的存在,Python在多线程里面其实是... python的多线程不是真正的多线程,所以使用多进程来实现高并发,比如训练模型读取数据时,但是kill只会杀死相应的进程ID,由于真实环境下子进程太多,一个一个去kill太麻烦,下面实现了只需要杀死进程id即可同时使子进程也退出: 1.进程和子进程的进程组ID是一样的,通过杀死进程组ID使进程和子进程都退出 2.通过signal.signal(signal.SIGTERM,... 3、使用 interrupt()方法中断线程线程时并不会立即终止线程,而是通知目标线程,告诉它有人希望你终止。至于目标线程收到通知后会如何处理,则完全由目标线程自行决定。