python多线程和GIL全局解释器锁
1、线程
2、多线程
3、并发:
4、并行:
5、串行:
一、多线程
1 mport threading
2 import time
3 # def test1():
4 # for i in range(10):
5 # time.sleep(1) #睡1s
6 # print('test1=========>%s' % i)
7 #
8 #
9 # def test2():
10 # for i in range(10):
11 # time.sleep(1)
12 # print('test2=========>%s' % i)
13 #
14 # t1 = threading.Thread(target=test1) #定义一个线程 target=函数名
15 # t2 = threading.Thread(target=test2)
16 # t1.start() #开启线程
17 # t2.start()
18 # test1()
19 # test2()
1 # def test1(n):
2 # time.sleep(1)
3 # print('task', n)
4 # for i in range(10):
5 # t = threading.Thread(target=test1,args=('t-%s' % i,)) #args= 后接输出结果 末尾必须加 “ , ” 号
6 # t.start()
1
2 # import threading
3 # import time
4 # def dest(n):
5 # time.sleep(1)
6 # print('this is running====>%s' %n)
7 # l = [] #定义一个空列表
8 # start = time.time() #开始的时间
9 # for i in range(10): #10个进程
10 # t = threading.Thread(target=dest,args=(i,))
11 # t.start()
12 # l.append(t) #把线程执行时间加入到列表
13 # for g in l:
14 # g.join() #等待全部线程执行完毕
15 # end = time.time() #执行结束时间
16 # print('time',(end-start)) #执行结束时间 - 开始执行的时间
1 import threading
2 import time
3 def test1(n):
4 time.sleep(1)
5 print('test1====>%s' %n)
6 def test2(n):
7 time.sleep(2)
8 print('test2====>%s' %n)
9 start = time.time()
10 l = []
11 t1 = threading.Thread(target=test1,args=(1,))
12 t2 = threading.Thread(target=test2,args=(2,))
13 t1.start()
14 t2.start()
15 l.append(t1)
16 l.append(t2)
17 for i in l:
18 i.join()
19 end = time.time()
20 print('time',(end - start))
1 # g_num = 0
2 # def update():
3 # global g_num #global声明全局变量
4 # for i in range(10):
5 # g_num += 1
6 #
7 # def reader():
8 # global g_num
9 # print(g_num)
10 #
11 # t1 = threading.Thread(target=update)
12 # t2 = threading.Thread(target=reader)
13 # t1.start()
14 # t2.start()
15
二、GIL全局解释器锁
1
2 # import threading
3 # global_num = 0
4 # def test1():
5 # global global_num #global声明全局变量
6 # for i in range(1000000):
7 # global_num += 1
8 # print("test1", global_num,threading.current_thread())
9 #
10 # def test2():
11 # global global_num
12 # for i in range(1000000):
13 # global_num += 1
14 # print("test2", global_num,threading.current_thread())
15 # t1 = threading.Thread(target=test1)
16 # t2 = threading.Thread(target=test2)
17 # t1.start()
18 # t2.start()
19 # print(global_num)
#互斥锁
1 import threading
2 import time
3 global_num = 0
4
5 lock = threading.Lock() #互斥锁
6
7 def test1():
8 global global_num
9 lock.acquire()
10 for i in range(1000000):
11 global_num += 1
12 lock.release()
13 print("test1", global_num)
14
15
16 def test2():
17 global global_num
18 lock.acquire()
19 for i in range(1000000):
20 global_num += 1
21 lock.release()
22 print("test2", global_num)
23
24 t1 = threading.Thread(target=test1)
25 t2 = threading.Thread(target=test2)
26 start_time = time.time()
27
28 t1.start()
29 t2.start()
30 t1.join()
31 t2.join()
32 print(global_num)
python多线程和GIL全局解释器锁的更多相关文章
- Python并发编程-GIL全局解释器锁
Python并发编程-GIL全局解释器锁 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.GIL全局解释器锁概述 CPython 在解释器进程级别有一把锁,叫做GIL,即全局解释 ...
- 网络编程-Python高级语法-GIL全局解释器锁
知识点:GIL全局解释器锁其实和Python没有任何关系,是由于当初编写Python解释器时留下的,它只对多线程有影响,GIL保证同一时刻只有一个线程在运行,即使是多核配置电脑,同一时刻也只会让一个线 ...
- Python中对于GIL全局解释器锁的一点理解
GIL全局解释器锁 python最初开发时,开发人只考虑到了单核CPU的,为解决多线程运算之间的数据完整性和状态同步选择了加锁的方式.即GIL锁. 而目前的CPU都有多个核心,在运行python的某个 ...
- 进程、线程与GIL全局解释器锁详解
进程与线程的关系: . 线程是最小的调度单位 . 进程是最小的管理单元 . 一个进程必须至少一个线程 . 没有线程,进程也就不复存在 线程特点: 线程的并发是利用cpu上下文的切换(是并发,不是并行) ...
- [Python 多线程] GIL全局解释器锁 (十三)
Queue 标准库queue模块,提供FIFO(先进先出)的Queue.LIFO(后进先出)的队列.优先队列. Queue类是线程安全的,适用于多线程间安全的交换数据.内部使用了Lock和Condit ...
- python GIL全局解释器锁,多线程多进程效率比较,进程池,协程,TCP服务端实现协程
GIL全局解释器锁 ''' python解释器: - Cpython C语言 - Jpython java ... 1.GIL: 全局解释器锁 - 翻译: 在同一个进程下开启的多线程,同一时刻只能有一 ...
- python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03
目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...
- python 并发编程 多线程 GIL全局解释器锁基本概念
首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念. 就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码. ...
- GIL全局解释器锁、死锁现象、python多线程的用处、进程池与线程池理论
昨日内容回顾 僵尸进程与孤儿进程 # 僵尸进程: 所有的进程在运行结束之后并不会立刻销毁(父进程需要获取该进程的资源) # 孤儿进程: 子进程正常运行 但是产生该子进程的父进程意外死亡 # 守护进程: ...
随机推荐
- Stream并行流详解
1.并行与并发的区别 在说到并行的时候,相信很多人都会想到并发的概念.那么并行和并发两者一字之差,有什么区别呢? 并行:多个任务在同一时间点发生,并由不同的cpu进行处理,不互相抢占资源 并行: 并发 ...
- Windows 上安装 PostgreSQL
PostgreSQL官网–>Download–>Windows 64位,如图所示: (1)官网: https://www.postgresql.org/ (2)Download: http ...
- python列表(九)元组
元组 元组是不可变序列,元组一旦创建,用任何方法都不可以修改其元素. 元组的偶有元素是放在一对圆括号"()"中 1.元组创建与删除 使用"="讲一个元组赋值给变 ...
- 10天,从.Net转Java,并找到月薪2W的工作(三)
放弃Offer之后,压力一天比一天打 好点的公司,除了技术追根问底,还对你平时代码实践问的很多.比如问你,redis缓存一般设置多大.问你项目内容的细节,业务流程. 集合.锁.Jvm.多线程高并发.微 ...
- Spring源码--debug分析循环依赖--构造器注入
目的:源码调试构造器注入,看看是怎么报错的. spring:5.2.3 jdk:1.8 一.准备 首先准备两个循环依赖的类:userService和roleServic <bean id=&qu ...
- 无延时去斗按键实现方法(不好CPU)
这一灵感来源于定时器计数的方法,最后可以实现的效果跟咱们电脑键盘按键的效果一样!我先来介绍下基本原理吧! 采用定时器中断的方法,比如定时器终端我们设置为5ms,我们需要按键按下超过40ms时才算有按键 ...
- hashmap的简易实现,基本实现PUT GET
p.p1 { margin: 0; font: 12px Menlo; color: rgba(79, 118, 203, 1) } /*简易版的HASHMAP包括基本的GET PUT思想 * 从数 ...
- github下载大文件太慢/失败
场景 github下载大文件,使用浏览器下载zip包到本地在下载到1G时失败, 使用 git clone ssh下载速度20k/s以下,已fq. 解决方法(亲测) 1.下载Github Desktop ...
- Thread线程控制之sleep、join、setDaemon方法的用处
Thread线程控制之sleep.join.setDaemon方法的用处 1. sleep方法 public static void sleep(long millis) throws Interru ...
- Java微服务 vs Go微服务,究竟谁更强!?
前言 Java微服务能像Go微服务一样快吗? 这是我最近一直在思索地一个问题. 去年8月份的the Oracle Groundbreakers Tour 2020 LATAM大会上,Mark Nels ...