首页 > 其他分享 >多线程之start()和run()

多线程之start()和run()

时间:2023-11-21 16:12:01浏览次数:31  
标签:run name thread threading MainThread start 线程 多线程 id

在实例调用的函数中加入打印当前线程的名字,分别用start()方法和run()方法启动线程检查有什么区别:

start()

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import threading import time   def worker():     count = 1     while True:         if count >= 6:             break         time.sleep(1)         count += 1         print("thread name = {}".format(threading.current_thread().name))#当前线程名   = threading.Thread(target=worker,name="MyThread") t.start()   print("===end===")   运行结果: ===end=== thread name = MyThread # thread name = MyThread thread name = MyThread thread name = MyThread thread name = MyThread

  从上面例子中打印的线程名字来看,使用start()方法启动的线程名是我们定义线程对象时设置的name="MyThread"的值,如果没有设置name参数值,则会打印系统分配的Thread-1,Thread-2...这样的名称。

run()方法

  import threading import time   def worker():     count = 1     while True:         if count >= 6:             break         time.sleep(1)         count += 1         print("thread name = {}".format(threading.current_thread().name))   = threading.Thread(target=worker,name="MyThread") t.run()   print("===end===")   运行结果: thread name = MainThread # thread name = MainThread thread name = MainThread thread name = MainThread thread name = MainThread ===end===

  上面例子中,使用的是用run()方法启动线程,它打印的线程名是MainThread,也就是主线程。

 

再看下多线程时的例子:

start():

  import threading import time   def worker():     count = 1     while True:         if count >= 6:             break         time.sleep(1)         count += 1         print("thread name = {}, thread id = {}".format(threading.current_thread().name,threading.current_thread().ident))   t1 = threading.Thread(target=worker,name="t1") t2 = threading.Thread(target=worker,name='t2')   t1.start() t2.start()   print("===end===")   运行结果: ===end=== thread name = t1, thread id = 6032 thread name = t2, thread id = 880 thread name = t1, thread id = 6032 thread name = t2, thread id = 880 thread name = t2, thread id = 880 thread name = t1, thread id = 6032 thread name = t1, thread id = 6032 thread name = t2, thread id = 880 thread name = t2, thread id = 880 thread name = t1, thread id = 6032

  上面例子中,start()方法启动了两个新的子线程并交替运行,每个子进程ID也不同。

run():

  import threading import time   def worker():     count = 1     while True:         if count >= 6:             break         time.sleep(1)         count += 1         print("thread name = {}, thread id = {}".format(threading.current_thread().name,threading.current_thread().ident))   t1 = threading.Thread(target=worker,name="t1") t2 = threading.Thread(target=worker,name='t2')   t1.run() t2.run()   print("===end===")   运行结果: thread name = MainThread, thread id = 2000 thread name = MainThread, thread id = 2000 thread name = MainThread, thread id = 2000 thread name = MainThread, thread id = 2000 thread name = MainThread, thread id = 2000 thread name = MainThread, thread id = 2000 thread name = MainThread, thread id = 2000 thread name = MainThread, thread id = 2000 thread name = MainThread, thread id = 2000 thread name = MainThread, thread id = 2000 ===end===

  上面例子中,两个子线程都用run()方法启动,但却是先运行t1.run(),运行完之后才按顺序运行t2.run(),两个线程都工作在主线程,没有启动新线程,因此,run()方法仅仅是普通函数调用。 

一个进程中至少有一个线程,并作为程序的入口,这个线程就是主线程。
一个进程至少有一个主线程,其它线程称为工作线程。

总结:

好了,从上面四个小例子,我们可以总结出:

  • start() 方法是启动一个子线程,线程名就是我们定义的name
  • run() 方法并不启动一个新线程,就是在主线程中调用了一个普通函数而已。

因此,如果你想启动多线程,就必须使用start()方法

标签:run,name,thread,threading,MainThread,start,线程,多线程,id
From: https://www.cnblogs.com/yogayao/p/17846780.html

相关文章

  • 多线程
    进程之间不能共享内存,但线程之间共享内存非常容易。操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。因此使用多线程来实现多任务并发执行比使用多进程的效率高python语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了pyth......
  • crunch 生成字典
    生成4位验证码crunch44-d2%-t%%%%>crunch.out1、各种符号%代表数字@代表小写字母,代表大写字符^代表特殊符号2、选项-t指定输出格式 -t  %%%%  输出四位纯数字-d允许相同元素最多连续出现的次数-d  2% ......
  • 多线程创建函数
    1、CreateThread()函数  CreateThread是一种微软在WindowsAPI中提供了建立新的线程的函数,该函数在主线程的基础上创建一个新线程。     线程终止运行后,线程对象仍然在系统中,必须通过CloseHandle函数来关闭该线程对象。1HANDLECreateThread(2LPSECURITY_ATT......
  • 在wsl中运行'./Allrun.sh'时报错:$'\r': command not found
    在Windows下编写好sh文件后,在Linux下或者wsl中运行会报错: line2:$'\r':commandnotfound 这是因为Windows系统的文件换行使用的是 \r\n ,而Unix系统是\n问题解决:dos2unixAllrun.shdos2unix是将Windows格式文件转换为Unix、Linux格式的实用命令。Windows格式文件的......
  • 【爬虫】多线程下载文件
    importrequests   importjsonfromlxmlimportetreefromconcurrent.futuresimportThreadPoolExecutor     导入多线程所需要的库defmians(num):  url=f"http://www.1o1o.xyz/ctfarticle.asp?offset={num}"  domain="http://www.1o1o.xyz/"......
  • Springboot自定义starter
    Springboot自定义sarter这里通过自定义mybatis的starter来简单进行分析理解步骤:创建dmybatis-spring-boot-autoconfigure模块,提供自动配置功能,并定义配置文件META-INF/spring/xxx.imports创建dmybatis-spring-boot-starter模块,在starter中引入自动配置模块创建项目:1......
  • npm run dev 一种出错
    Error:error:0308010C:digitalenveloperoutines::unsupportedatnewHash(node:internal/crypto/hash:69:19)atObject.createHash(node:crypto:133:10)atmodule.exports(/Users/a1/Desktop/vue_test/form-generator-dev/node_modules/webpack/lib/util......
  • Running DPDK Forwarding Applications With Pktgen-DPDK
    Aspartoftheevaluationstageofourbachelorthesis,wesetupatestbedforrunningforwardingapplicationsinDPDKandwithPktgen-DPDKasthetrafficgenerator.Inthisblog,weaimtocover作为学士论文评估阶段的一部分,我们建立了一个测试平台,用于在DPDK......
  • Java多线程消费消息
    多线程消费消息关键词:Java,多线程,消息队列,rocketmq多线程一个用例之一就是消息的快速消费,比如我们有一个消息队列我们希望以更快的速度消费消息,假如我们用的是rocketmq,我们从中获取消息,然后使用多线程处理。代码地址Github实现思路不停的拉取消息将拉取的消息分片多个线程......
  • spring-boot-starter-thymeleaf 避坑指南
    spring-boot-starter-thymeleaf避坑指南第一步:pom配置环境先不要管包是做什么的总之必须要有否则进坑1234567891011<!--避坑包-->      <dependency>          <groupId>net.sourceforge.nekohtml</groupId>          <a......