首页 > 编程语言 >2020-07-30-python-multithreading&multiprocessing

2020-07-30-python-multithreading&multiprocessing

时间:2023-05-09 20:35:35浏览次数:43  
标签:__ GIL 07 python 30 线程 time 进程 多线程

注:参考Python多线程多进程那些事儿看这篇就够了~~

进程、线程

进程和线程简单举例:
对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程。
有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。

进程与线程的区别:简而言之,一个程序至少有一个进程,一个进程至少有一个线程。进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行。多线程可以共享全局变量,多进程不能。多线程中,所有子线程的进程号相同;多进程中,不同的子进程进程号不同。

1. 并行和并发

  • 并行处理:是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间。
  • 并发处理:指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机(CPU)上运行,但任一个时刻点上只有一个程序在处理机(CPU)上运行。

2. 同步与异步

  • 同步:指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去。
  • 异步:指进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程的状态,当有消息返回时系统会通知进程进行处理,这样可以提高执行效率。

为了高效率的执行,就有了并发编程、多线程、多进程等概念,这里就要提一下“GIL(全局解释锁:Global Interpreter Lock)”了

3. GIL

首先需要明确的一点是 GIL 并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念,所以Python完全可以不依赖于GIL。那么CPython实现中的GIL又是什么呢?使用Python多线程的人都知道,Python中由于GIL的存在,在多线程时并没有真正的进行多线程计算。GIL说白了就是伪多线程,一个线程运行其他线程阻塞,使你的多线程代码不是同时执行,而是交替执行。

下面用代码来说明GIL的多线程是伪多线程。

# 单线程执行代码
from threading import Thread
import time
 
def my_counter():
    i = 0
    for _ in range(100000000):
        i = i + 1
    return True
 
def main():
    thread_array = {}
    start_time = time.time()
    for tid in range(2):
        t = Thread(target=my_counter)
        t.start()
        t.join()
    end_time = time.time()
    print("Total time: {}".format(end_time - start_time))
 
if __name__ == '__main__':
    main()

结果: Total time: 26.5897

# 两个线程并发执行代码
from threading import Thread
import time
 
def my_counter():
    i = 0
    for _ in range(100000000):
        i = i + 1
    return True
 
def main():
    thread_array = {}
    start_time = time.time()
    for tid in range(2):
        t = Thread(target=my_counter)
        t.start()
        thread_array[tid] = t
    for i in range(2):
        thread_array[i].join()
    end_time = time.time()
    print("Total time: {}".format(end_time - start_time))
 
if __name__ == '__main__':
    main()

结果: Total time: 39.5884

可以看到多线程反而慢了十几秒。但并不是说Python多线程完全无用,其多用于IO密集型的应用。

4. 应用类型

  • IO密集型:对于IO密集型的应用,涉及到网络、磁盘IO的任务都是IO密集型任务,大多消耗都是硬盘读写和网络传输的消耗。
  • 计算密集型 :计算密集型,顾名思义就是应用需要非常多的CPU计算资源,在计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。

那么GIL多线程的不足,其实是对于计算密集型的不足,这个解决可以利用多进程进行解决,而对于IO密集型的任务,仍可以使用多线程进行提升效率。

标签:__,GIL,07,python,30,线程,time,进程,多线程
From: https://www.cnblogs.com/qiuhlee/p/17386164.html

相关文章

  • C#设计模式07——装饰器模式的写法
    装饰器模式是一种结构型设计模式,可以在不修改原始对象的基础上添加新的功能和行为。该模式通过将对象包装在具有相同接口的装饰器类中来实现此目的。以下是5W1H分析:What(什么)?装饰器模式是一种结构型设计模式,它允许在运行时动态地向对象添加新的功能和行为,而无需修改原始对象的代......
  • 分享一个提高运维效率的 Python 脚本
    哈喽大家好我是咸鱼,今天给大家分享一个能够提升运维效率的python脚本咸鱼平常在工作当中通常会接触到下面类似的场景:容灾切换的时候批量对机器上的配置文件内容进行修改替换对机器批量替换某个文件中的字段对于Linux机器,咸鱼可以写个shell脚本或者直接批量使用sed命......
  • 力扣 724. 寻找数组的中心下标 --python
    给你一个整数数组 nums,请计算数组的中心下标。数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端,那么左侧数之和视为0,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个......
  • Python中的文件操作
    我们的当前工作路径为:E:\\Miniconda\\envs\\Practice_env\\d2l-zh\\python中的文件操作1.从文件中读取数据1.使用file_object.read()读取整个文件的内容。其中file_object是一个表示文件的对象: 要以任何方式使用文件,哪怕是仅仅打印其内容,都要先打开这个文件。函数open()用......
  • python+selenium+js操作网页元素
    调用JS语法需要用到selenium中的方法 execute_script() ,参数直接填写JS语法。#1、通过元素id属性,获取元素document.getElementById('id');#2、通过元素name属性,获取元素列表document.getElementsByName(‘name’);#3、通过标签名,获取元素列表document.getElementsByT......
  • Springboot-hbase增删改20230509
    1、启动 2、ZK客户端    3、springboot+hbase实例1)、pom<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId&......
  • ASEMI代理ADI亚德诺LT6230CS6-10#TRPBF车规级芯片
    编辑-ZLT6230CS6-10#TRPBF特点:低噪声电压:1.1nV/√Hz低电源电流:3.5mA/Amp(最大值)低失调电压:350μV(最大值)增益带宽积:LT6230:215MHz;V≥1__LT6230-10:1450MHz;V≥10__宽电源范围:3V至12.6V轨到轨输出摆幅共模抑制比:115dBTyp输出电流:30mA工作温度范围:–40°C至85°CL......
  • 20230509001 - DataTable 导出成Excel
               DataTabledt_e=DataSet0.Tables[0];           SaveFileDialogsaveFileDialog=newSaveFileDialog();           saveFileDialog.Filter="Execlfiles(*.xls)|*.xls";           saveFileDialog.FilterIndex......
  • [AtCoder-AT_ABC070C]题解(C++)
    PartIPreface原题目(Luogu)原题目(AtCoder)PartIISketch给定一个正整数\(N(1\leqN\leq100)\),表示时钟数量。接下来\(N\)行,每行一个正整数\(T_i(1\leqT_i\leq10^{18})\),表示每个时钟旋转\(T_i\)秒后还会回到原来的地方。求出在多少秒之后,所有时钟还会同时......
  • python 循环中使用index索引
    #使用enumerate()实现ints=[8,23,45,12,78]foridx,valinenumerate(ints):print(idx,val)ints=[8,23,45,12,78]forindex,iteminenumerate(ints,start=0):#默认是从0开始print(index,item)ints=[8,23,45,12,78]forindex,it......