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多线程的用处、进程池与线程池理论
昨日内容回顾 僵尸进程与孤儿进程 # 僵尸进程: 所有的进程在运行结束之后并不会立刻销毁(父进程需要获取该进程的资源) # 孤儿进程: 子进程正常运行 但是产生该子进程的父进程意外死亡 # 守护进程: ...
随机推荐
- iOS常见遍历方法汇总
一.for循环 NSArray *iosArray = @[@"L", @"O", @"V", @"E", @" ...
- C# 数据结构与算法 操作系统原理 计算机网络原理 数据库开发学习
https://www.cnblogs.com/edisonchou/p/3843287.html PDF https://files.cnblogs.com/files/netlock/%E6%95 ...
- 【命令】ln命令
这是linux中一个非常重要命令,请大家一定要熟悉.它的功能是为某一个文件或目录在另外一个位置建立一个同步的链接,默认是链接是硬链接,常用参数是 "-s" . 对于ln命令,这里 ...
- NPOI导入excel
1.引用NPOI: using NPOI.HSSF.UserModel;using NPOI.HSSF.Util;using NPOI.SS.UserModel; 2.导出excel 1 privat ...
- 一.C语言概述
C语言的起源 贝尔实验室的Dennis Ritchie在1972年开发了C,当时他正与ken Thompson一起设计UNIX操作系统,然而,C并不是完全由Ritchie构想出来的.它来自Thomps ...
- java.lang.NoSuchMethodError的解决办法
开发一个知识图谱在线服务(基于springcloud+vue)构建中医理论的知识图谱构建帕金森的知识图谱提供免费的知识图谱服务,希望能为朋友们的生活.学习.工作提供帮助(敬请期待)PS:关注后,点击头 ...
- SSM框架实现多张图片和其他数据一起上传
一.SSM+Form 多张图片和其他数据一起上传, 1.导包: commons-fileupload-1.3.3.jar commons-io-2.4.jar 2.springmvc.xml 文件配置 ...
- JVM内存设置多大合适?Xmx和Xmn如何设置?
JVM内存设置多大合适?Xmx和Xmn如何设置? 问题:新上线一个java服务,或者是RPC或者是WEB站点, 内存的设置该怎么设置呢?设置成多大比较合适,既不浪费内存,又不影响性能呢? 分析:依 ...
- lambda表达式初识
简单来说,一般提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 而匿名函数就是没有名字的函数,有时函数只是临时一用,而且它的业务逻辑也相 ...
- 基于ROBO-MAS多智能体自主协同 高频投影定位系统