不是大神。尝试回答一下。

首先解释下什么叫做线程,什么叫做进程,在解释这两个概念前,我们还需要明白什么叫做GIL全局解释器锁。GIL 全局解释器锁: GIL(全局解释器锁,GIL 只有cpython有):在同一个时刻,只能有一个线程在一个cpu上执行字节码,没法像c和Java一样将多个线程映射到多个CPU上执行,但是GIL会根据执行的字节码行数(为了让各个线程能够平均利用CPU时间,python会计算当前已执行的微代码数量,达到一定阈值后就强制释放GIL)和时间片以及遇到IO操作的时候主动释放锁,让其他字节码执行。说白了GIL就是伪多线程,一个线程运行其他线程阻塞,使你的多线程代码不是同时执行,而是交替执行。

python的多线程:由于GIL的原因,一个CPU同一个时刻只能执行一个线程,但是当遇到IO操作或者运行一定的代码量的时候就会释放全局解释器锁,执行另外一个线程。多线程能够有效提升I/O阻塞型程序的效率;与进程相比,占用的系统资源少;线程间能够共享资源,方便进行通信。python的多线程通过threading实现。

python的多进程:进程几乎可以完成线程能够完成的任何事情。与之不同的是,一个进程里面,包含一个主线程,还可以生成很多子线程。如果有需要的话,可以将它们组成多线程。多进程能够.更好地利用多核处理器;.在处理CPU密集型任务时比多线程要好;可以通过多进程来避免全局解释器锁(GIL)的局限;崩溃的进程不会导致整个程序的崩溃。python中的多进程主要通过multiprocessing模块实现。

threading实现多线程

python中提供两个标准库thread和threading用于对线程的支持,python3中已放弃对前者的支持,后者是一种更高层次封装的线程库,接下来均threading为例实现多线程。

1.创建线程

python中有两种方式实现线程:

(1) 实例化一个threading.Thread的对象,并传入一个初始化函数对象(initial function )作为线程执行的入口;

import threading

import time

def tstart(arg):

time.sleep(0.5)

print("%s running...." % arg)

if __name__ == '__main__':

t1 = threading.Thread(target=tstart, args=('This is thread 1',))

t2 = threading.Thread(target=tstart, args=('This is thread 2',))

t1.start()

t2.start()

t1.join()

t2.join()

print("This is main function")

(2) 继承threading.Thread,并重写run函数;

import threading

import time

class CustomThread(threading.Thread):

def __init__(self, thread_name):

# step 1: call base __init__ function

super(CustomThread, self).__init__(name=thread_name)

self._tname = thread_name

def run(self):

# step 2: overide run function

time.sleep(0.5)

print("This is %s running...." % self._tname)

if __name__ == "__main__":

t1 = CustomThread("thread 1")

t2 = CustomThread("thread 2")

t1.start()

t2.start()

t1.join()

t2.join()

print("This is main function")

上面两种方法本质上都是直接或者间接使用threading.Thread类,实例化后,threading.Thread的主要方法有:start():创建线程后通过start启动线程,等待CPU调度,为run函数执行做准备; run():线程开始执行的入口函数,函数体中会调用用户编写的target函数,或者执行被重载的run函数; (start() 方法是启动一个子线程,线程名就是我们定义的name;run() 方法并不启动一个新线程,就是在主线程中调用了一个普通函数而已。通过Thread类的start方法,可以启动该线程,交给python虚拟机进行调度,当该线程获得执行的机会时,就会调用run方法执行线程。) join([timeout]):阻塞挂起调用该函数的线程,直到被调用线程执行完成或超时。通常会在主线程中调用该方法,等待其他线程执行完成。 name、getName()&setName():线程名称相关的操作; ident:整数类型的线程标识符,线程开始执行前(调用start之前)为None; isAlive()、is_alive():start函数执行之后到run函数执行完之前都为True; daemon、isDaemon()&setDaemon():守护线程相关;

2.执行多线程

前面在解释start()和run()方法时,提到了主线程和子线程,主线程:一个进程中至少有一个线程,并作为程序的入口,这个线程就是主线程(从一开始的代码执行到最后的打印出执行时间为主线程) 子线程:一个进程至少有一个主线程,其它线程称为子线程; 在主线程中创建若线程之后,他们之间没有任何协作和同步,除主线程之外每个线程都是从start()开始被执行,直到执行完毕。

上面的例子中可以发现一共有3个线程,1个主线程和2个子线程,如何定义子线程的?其实在代码中就发现了,使用t1 = threading.Thread(target=tstart)即可生成一个子线程,然后使用t1.start()即可启动这个子线程,这样的话t1.jion()是不是就多余呢?其实不然,使用t1.jion()的作用就是:等待子线程执行完毕后再执行主线程,如果不加上t1.jion()的话,子线程任然执行,但是子线程再等待的时候(io操作的时候),释放出资源,这个时候主线程拿到资源运行主线程的任务,然后再等待子线程运行结束,最后退出主程序。

所以t1.jion()放到位置很重要:

t1.start()

t1.join()

t2.start()

t2.join()

如果这样放的话,就是先执行线程1然后等待线程1执行完毕,然后执行线程2等待线程2执行完毕。

t1.start()

t2.start()

t1.join()

t2.join()

这样的话就不一样,会等到线程1与线程2执行完毕后再执行主线程。

还有很多其他的线程相关的知识点,比如线程之间的优先级、通信等等。下面链接中的这位大神总结的非常全面,可以参考:https://blog.csdn.net/lzy98/article/details/88819425

查看我的更多相关回答:溪亭日暮:汇编 | 我的AI 技术回答​zhuanlan.zhihu.com

python 多线程并发_寻找python大神!!!python如何多线程并发?相关推荐

  1. python 翻译库_有没有大神用Python Requests库翻译一下呢?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import org.apache.http.HttpResponse; import org.apache.http.NameValuePair;imp ...

  2. s1.1024gc.net/bbs/index.php,1.12.2游戏崩溃/_ \,那位大神解答一下

    1.12.2游戏崩溃/_ \,那位大神解答一下 1.12.2游戏崩溃的log: [19:26:12] [main/INFO] [LaunchWrapper]: Loading tweak class ...

  3. aoc显示器开机显示计算机,_求各路大神帮忙解决,配置如下 电脑开机AOC显示器显示无信号,每次都要重新拔了再插才有画面_...

    网友求助:_求各路大神帮忙解决,配置如下 电脑开机AOC显示器显示无信号,每次都要重新拔了再插才有画面_ 问题求各路大神帮忙解决,配置如下 电脑开机AOC显示器显示无信号,每次都要重新拔了再插才有画面 ...

  4. python大神教程_大神python教程415集全套,拿走不谢

    大神的教程 由北京尚学堂高淇老师亲自录制,2019Python自学教程全新升级为<Python+数据分析+机器学习>能力逐级提升,打造技能更全面的全栈工程师. Python作为一种编程语言 ...

  5. 420集的python教程下载_清华学霸录制 420集python视频教程给你拿去学!两个月让你变大神...

    Python已经成为一种再主流不过的编程语言了.它天生丽质,易于读写,非常实用,从而赢得广泛的群众基础,被誉为"宇宙最好的编程语言",被无数程序员热烈追捧. 随着时代的发展越来越快 ...

  6. python 知乎美女_知乎大神用Python爬取高颜值美女(爬虫+人脸检测+颜值检测)

    原标题:知乎大神用Python爬取高颜值美女(爬虫+人脸检测+颜值检测) 1 数据源 知乎话题『美女』下所有问题中回答所出现的图片 2 抓取工具 Python 3,并使用第三方库 Requests.l ...

  7. python 知乎美女_知乎大神教你用Python爬取网站美女图,附代码!

    都知道Python的抓取功能强大,可以帮我们从海量的数据中爬取所需要的进行分析.下面,就给大家分享知乎大神怎么用Python爬取高颜值美女! 1.数据源 知乎话题『美女』下所有问题中回答所出现的图片 ...

  8. 微软大神的python语言入门_你是如何自学 Python 的?

    [个人介绍] 本人大学专业为"高分子材料与工程",属化学方向,毫无编程经验,但在18年中由于工作需要处理大量数据,"被迫"学习了数据库和Python,虽然不能算 ...

  9. python新年快乐代码_先祝福大家新年快乐 Python 大神们 帮忙看看是什么问题

    5 339 天前 @Sylv Python 3 的错误提示 ```Python Traceback (most recent call last): File "C:/Python/test ...

最新文章

  1. 软件测试实验--性能测试工具LoadRunner
  2. CISCO-CCNA课程介绍
  3. Sed教程(四):基本命令、特殊字符、字符串
  4. JQuery中的类选择器
  5. 用fiddler抓包小程序
  6. Python以进程方式无黑窗在后台运行(无命令窗)
  7. 阿里巴巴AI智能专场:整理分享
  8. 学习云存储需要了解的一些技术知识
  9. OTA升级的三种方式
  10. 华为:当丑小鸭变成黑天鹅?
  11. 安卓蓝牙开发(1)BLE蓝牙基础知识和一般开发流程
  12. REMOTE HOST IDENTIFICATION HAS CHANGED问题解决
  13. 试水Bilibili/ijkplayer-Android
  14. Python编写的命令行版微信。(已集成自动聊天机器人(通过网址api形式))
  15. 烤仔观察 | 从 KuCoin 被盗聊起,盘一盘那些年我们丢过的币
  16. C语言中system函数用法解释
  17. nRF24L01+不能接收或接收偶尔异常等问题实战分享
  18. transformer论文研读
  19. php scada,科远风场SCADA系统的应用
  20. IBM在欧洲建首台量子计算机

热门文章

  1. maven 中 pom.xml 配置文件标签说明,dependencyManagement和dependencies区别
  2. Cadence 电源完整性仿真实践(二)
  3. java 实现excel 导出功能
  4. Word -- 列表重新编号
  5. echarts 柱状图 ,颜色和显示设置
  6. FlashCC学习札记
  7. ASP.NET 2.0服务器控件与组件开发中文版即将出版
  8. 用友云开发者中心助你上云系列之在线调试
  9. E24- please install the following Perl modules before executing ./mysql_install_db
  10. 项目开发容易出错情况统计