返回顶部
首页 > 资讯 > 后端开发 > Python >python中start和run方法的区别
  • 375
分享到

python中start和run方法的区别

2024-04-02 19:04:59 375人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

结论:启动线程,如果对target进行赋值,并且没有重写run方法,则线程start的时候会直接调用target中对应的方法 具体代码如下:1、初始化一个线程 threading.T

结论:启动线程,如果对target进行赋值,并且没有重写run方法,则线程start的时候会直接调用target中对应的方法

具体代码如下:
1、初始化一个线程

threading.Thread.__init__(self,target=thread_run())

def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs=None, *, daemon=None):
        assert group is None, "group argument must be None for now"
        if kwargs is None:
            kwargs = {}
        self._target = target
        self._name = str(name or _newname())
        self._args = args
        self._kwargs = kwargs

2、调用start启动线程
最终调用_start_new_thread方法,self._bootstrap作为传参

thread1.start()
    def start(self):
        if not self._initialized:
            raise RuntimeError("thread.__init__() not called")
        if self._started.is_set():
            raise RuntimeError("threads can only be started once")
        with _active_limbo_lock:
            _limbo[self] = self
        try:
            _start_new_thread(self._bootstrap, ())
        except Exception:
            with _active_limbo_lock:
                del _limbo[self]
            raise
        self._started.wait()

3、_start_new_thread等同于启动一个新线程,并在新线程中调用回调函数

_start_new_thread = _thread.start_new_thread
def start_new_thread(function: Callable[..., Any], args: tuple[Any, ...], kwargs: dict[str, Any] = ...) -> int: ...

4、执行的回调函数就是上文传入的self._bootstrap, _bootstrap方法直接调用_bootstrap_inner(),而bootstrap_inner则调用run方法

def _bootstrap_inner(self):
    try:
        self._set_ident()
        self._set_tstate_lock()
        if _HAVE_THREAD_NATIVE_ID:
            self._set_native_id()
        self._started.set()
        with _active_limbo_lock:
            _active[self._ident] = self
            del _limbo[self]

        if _trace_hook:
            _sys.settrace(_trace_hook)
        if _profile_hook:
            _sys.setprofile(_profile_hook)
        try:
            self.run()

5、最终调用run方法

 def run(self):
        try:
            if self._target:
                self._target(*self._args, **self._kwargs)
        finally:
            # Avoid a refcycle if the thread is running a function with
            # an argument that has a member that points to the thread.
            del self._target, self._args, self._kwargs

结论:
如果run方法被重写,则直接调用重写的run方法
如果run方法没有被重写,并且target被定义,则会直接调用线程创建时候的target方法,否则什么也不做

此处遇到一问题:
指定target参数,在执行过程中,打印的进程名mainthread(主进程),而不是之前所赋的进程名
threading.Thread.init(self,target=thread_run())
分析后发现赋予target的是执行的函数体,因此会先执行thread_run函数,执行结束后,将thread_run的返回值赋给了target,因为thread_run没有返回值,因此target的值是None,如果此时没有重写run函数,那么线程什么都不会做。 thread_run的执行是在主线程,而不是我们所认为的在子线程中执行thread_run

def thread_run():
    print ("overwrite: 开始线程:" + threading.current_thread().name)
    time.sleep(2)
    print ("overwrite: 退出线程:" + threading.current_thread().name)

class myThread (threading.Thread):
    def __init__(self, threadID, name, delay):
        threading.Thread.__init__(self,target=thread_run())
        self.threadID = threadID
        self.name = name
        self.delay = delay
        thread1.start()

thread1.join()
print ("退出主线程")

运行结果:

overwrite: 开始线程:MainThread
overwrite: 退出线程:MainThread
退出主线程

到此这篇关于python中start和run方法的区别的文章就介绍到这了,更多相关Python start和run方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python中start和run方法的区别

本文链接: https://lsjlt.com/news/138967.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python中start和run方法的区别
    结论:启动线程,如果对target进行赋值,并且没有重写run方法,则线程start的时候会直接调用target中对应的方法 具体代码如下:1、初始化一个线程 threading.T...
    99+
    2024-04-02
  • python中start和run方法有什么区别
    今天小编给大家分享一下python中start和run方法有什么区别的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。结论:启动...
    99+
    2023-06-29
  • docker run和start的区别说明
    docker中run和start的区别 docker run 后面指定的是一个镜像 而docker start指定的是一个容器 docker run是利用镜像生成容器,并启动容器,而...
    99+
    2024-04-02
  • java中start()和run()的区别有哪些
    这篇文章主要介绍了java中start()和run()的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java是什么Java是一门面向对象编程语言,可以编写桌面应用...
    99+
    2023-06-14
  • java中start方法与run方法有什么区别
    本篇文章给大家分享的是有关java中start方法与run方法有什么区别,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java有哪些集合类Java中的集合主要分为四类:1、Li...
    99+
    2023-06-14
  • Java线程中的常见方法(start方法和run方法)
    目录start方法和run方法示例代码注意sleep方法与yield方法sleepyield线程优先级sleep的应用-防止cpu占用100%join方法有实效的等待interrup...
    99+
    2024-04-02
  • Java Thread中start()和run()的区别_动力节点Java学院整理
    start() 和 run()的区别说明start() : 它的作用是启动一个新线程,新线程会执行相应的run()方法。start()不能被重复调用。run()   : run()就和普通的成员方法一样,可以被重复调用。...
    99+
    2023-05-31
    thread start run
  • Java线程中start方法如何回调run方法
    小编给大家分享一下Java线程中start方法如何回调run方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java 创建线程的方法实际上,创建线程最重要的是提...
    99+
    2023-05-30
    java start run
  • vue中npm run dev和npm run build的区别是什么
    这篇文章主要介绍vue中npm run dev和npm run build的区别是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!关于vue的npm run dev和npm run...
    99+
    2024-04-02
  • vue中npm run dev和npm run build有什么区别
    本篇内容介绍了“vue中npm run dev和npm run build有什么区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!具体如下:...
    99+
    2023-07-04
  • VBS中Run和Exec有哪些区别
    这篇文章主要介绍VBS中Run和Exec有哪些区别,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Set ws = CreateObject("WScript.Shell&quo...
    99+
    2023-06-08
  • python中的 sorted()函数和sort()方法区别
    目录1.sort()2.sorted()3.sorted()操作列表4.sorted()排序字典①参数key:使用lambda定义②参数key:使用itemgetter直接生成1.s...
    99+
    2024-04-02
  • docker中的run/cmd/entrypoint的区别详解
    Dockerfile中run、cmd和entrypoint都能够用于执行命令,下面是三者的主要用途: run命令执行命令并创建新的镜像层,通常用于安装软件包 cmd...
    99+
    2024-04-02
  • python中方法绑定和未绑定的区别
    这篇文章将为大家详细讲解有关python中方法绑定和未绑定的区别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB...
    99+
    2023-06-14
  • Java中为什么start方法不能重复调用而run方法可以?
    初学线程时,总是将 run 方法和 start 方法搞混,虽然二者是完全不同的两个方法,但刚开始使用时很难分清,原因就是因为初次使用时效果貌似是一样的, 如下代码所示: public...
    99+
    2024-04-02
  • python中=和==的区别
    python中“=”表示的是赋值,是将某一数值赋给某个变量,且无返回值;而“==”表示的是判断两个数据是否相等,其返回值为True或False。实例:a = 33 == 4print(a)输出结果为:3false...
    99+
    2024-04-02
  • C#中Abstract方法和Virtual方法的区别
    简介: c#中Abstract和Virtual比较容易混淆,都与继承有关,并且涉及override的使用。virtual可以被子类重写,而abstract必须被子类重写。virtua...
    99+
    2024-04-02
  • Python中set与frozenset方法和区别详解
    set(可变集合)与frozenset(不可变集合)的区别: set无序排序且不重复,是可变的,有add(),remove()等方法。既然是可变的,所以它不存在哈希值。基本功能包括关系测试和消除重复元素. ...
    99+
    2022-06-04
    详解 区别 方法
  • Python-list中的append()和extend()方法有哪些区别
    小编给大家分享一下Python-list中的append()和extend()方法有哪些区别,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 一、append()和extend()方法都是...
    99+
    2024-04-02
  • Python 类方法和静态方法之间的区别
    目录前言1. 实例方法 instance method2. 类方法 class method3. 静态方法 static method前言 类中不仅可以有 methods,还可以有变...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作