python多线程

python高级编程学习——08—(共享全局变量资源竞争、互斥锁、死锁、线程同步、多任务版udp聊天)

假如想象 提交于 2020-01-17 03:52:11
1、 共享全局变量资源竞争 前面文章介绍了一个线程写入,一个线程读取,没问题, 但是如果两个线程都写入会造成阻塞 import threading num = 0 def demo1 ( nums ) : global num for i in range ( nums ) : num += 1 print ( 'demo1--------%d' % num ) # demo1--------1171003 数值异常就是资源竞争的结果 def demo2 ( nums ) : global num for i in range ( nums ) : num += 1 print ( 'demo2--------%d' % num ) # demo2--------1262790 数值异常就是资源竞争的结果 def main ( ) : t1 = threading . Thread ( target = demo1 , args = ( 1000000 , ) ) t2 = threading . Thread ( target = demo2 , args = ( 1000000 , ) ) t1 . start ( ) t2 . start ( ) print ( 'main-------%d' % num ) # main-------541178 if __name__ =

线程

旧街凉风 提交于 2020-01-15 06:19:26
多进程多线程的join和队列的join是不一样的 进程队列 q=multiprocess.Queue() 多个进程之间能通信(不建议,一般用管道实现进程间通信) 线程队列 q=queue.Queue() 多个线程之间能通信 多进程同步中的Lock ,需要传给Process 多线程的 进程线程的特点 每个进程都有自己 独立的 内存地址 线程之间的切换 相对于 进程之间切换 更为方便,代价也更低。 对于IO密集型的任务,使用多线程还是能提高一下CPU使用率。 对于CPU密集型的任务,Python中的多线程其实是个鸡肋……没卵用……在Python的解释器CPython中存在一个互斥锁。简单来讲就是同一时间只能有一个线程在执行,其它线程都处于block模式。 要想在py中充分利用多核cpu,就只能用多进程了。虽然代价高了些,但是比起并行计算带来的性能提升这些也微不足道了。 进程与线程的关系区别 一个程序至少有一个进程,一个进程至少有一个线程.(进程可以理解成线程的容器)进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动

线程的知识点补充

房东的猫 提交于 2020-01-15 04:24:32
GIL全局解释器锁 """ In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. """ """ ps:python解释器有很多种 最常见的就是CPython解释器 CIL本质也是一把互斥锁:将并发变成串行牺牲效率保证数据的安全 用来阻止同一个进程下的多个线程的同时执行(同一个进程内多个线程无法实现并行但是可以实现并发) python的多线程没法利用多核优势 是不是就是没有用了? GIL的存在是因为CPython解释器的内存管理不是线程安全的 垃圾回收机制 1.引用计数 2.标记清除 3.分代回收 研究python的多线程是否有用需要分情况讨论 四个任务 计算密集型的 10s 单核情况下 开线程更省资源 多核情况下 开进程 10s 开线程 40s 四个任务 IO密集型的 单核情况下 开线程更节省资源 多核情况下 开线程更节省资源 """ # 计算密集型 # from

python线程

好久不见. 提交于 2020-01-15 03:31:16
"""线程"""进程是内存分配的最小单位,线程是调度的最小单位。每个进程中至少有一个线程"""线程与进程的区别: 进程相互独立,同一进程的各个线程间资源共享,某进程内的线程在其他进程内不可见。 进程间通信IPC,线程可以直接读写进程数据段来进行通信-需要同步和互斥锁等,保证数据的一致性。 线程上下文切换比进程快很多 在多线程操作系统中进程不是一个可执行的实体 python的线程模块常用thread、threading,threading提供更高级的线程管理建议使用。 查看treading.Tread的类可知参数 def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None): target是函数 name是线程名""" 开启线程 1 import threading 2 3 def product(number): 4 print(number,) 5 6 thread_lst = [] 7 #开启100线程 8 for i in range(100): 9 t = threading.Thread(target=product,args=(i,)) 10 t.start() #执行start开启线程 11 thread_lst.append(t) 12 13

day 036 线程 -创建,守护线程

早过忘川 提交于 2020-01-15 03:25:02
线程和进程的关系 1.地址空间和其他资源:进程之间相互独立,同一进程的各线程之间共享,某进程内的线程在其他进程不可见 2.通信:进程间的通信IPC,线程间可以直接写进程数据(如全局变量)来通信需要加锁保证数据一致 3.调度和切换:线程上下文切换比进程快很多 4.在多线程操作系统中,进程不是一个可执行的实体,真正去执行程序的不是进程是线程,进程就是一个线程的容器 线程的主要特点: 1.轻型实体 2.独立调度和分派的基本单位 3.共享进程资源 4.可并发执行 线程的创建 两种方法: from threading import Thread class MyThread(Thread): def __init__(self,n): super().__init__() self.n=n def run(self): print(self.n) if __name__ == '__main__': t=MyThread(100) t.start() 第二种: from threading import Thread def func(n): print(n) if __name__ == '__main__': t=Thread(target=func,args=(100,)) t.start() 死锁现象及递归锁: import time from threading import

锁 和 线程池

别说谁变了你拦得住时间么 提交于 2020-01-14 23:06:57
Python中的各种锁:   全局解释器锁:     1;什么是全局解释器锁?       每个CPU在同一时间只能执行一个线程,那么其他线程就必须等待该线程的全局解释器,使用权消失后才能使用全局解释器.即使多个线程直接不会相互影响在同一个进程下也只有一个线程使用CPU,这样的机制称为全局解释器锁(GIL).GIL的设计简化了CPython的实现,使得对象模型包括关键字的内建类型,如:字典,等都是隐含的可以并发访问的,锁住全局解释器,使得比较容易的实现对线程的支持,但也损失了多处理器主机的并行计算能力     2;全局解释器锁的好处       避免了大量的加锁解锁       使数据更加安全,解决多线程间的数据完整性和状态同步     3;全局解释器的缺点       多核处理器退化成单核处理器,只能并发不能并行     4;GIL的作用:       多线程情况下必须存在资源的竞争,GIL是为了保证在解释器级别的线程唯一使用共享资源(CPU)  同步锁: from threading import Thread import os,time def work(): global n temp = n time.sleep(1) n = temp-1 if __name__ = '__main__': n = 100 l =[] for i in range(100): p =

python 进程Process模块(40)

自古美人都是妖i 提交于 2020-01-14 08:58:13
目录 一.进程Process简介 二.进程Process模块 三.进程Process函数介绍 四.进程Process使用 小窍门: python进程Process与线程threading的区别 一.进程Process简介 进程Process是对各种资源管理的集合,包含对各种资源的调用、内存的管理、网络接口的调用;一个进程Process可以包含多个子进程,启动一个进程的时候会自动创建一个 线程 ,进程里的第一个线程就是主线程(即 python __name__ == ‘__main__’ ); 二.进程Process模块 对于线程操作可以用threading模块,那么对于进程的创建python同样也提供了Process模块,创建进程时需要导入该模块,语法如下: # 导入进程模块 from multiprocessing import Process # 创建进程 p = Process(group=None, target=None, name=None, args=(), kwargs={}) 参数介绍: group — 参数未使用,默认值为None; target — 表示调用对象,即子进程要执行的任务(函数名字); args — 子进程对应函数的参数,并且类型是元组tuple; kwargs — 子进程对应函数的参数,并且类型是字典dict,如kwargs = {‘name’

python3线程练习-

眉间皱痕 提交于 2020-01-13 18:40:52
python3线程练习-上位机开发1 这是我的第一篇博文,公司突然要求让弄一个上位机,主要是要连接数字万用表和公司自己的开发的测校准仪,下面是仪器的连接图, 我们公司自己开发的仪器,主要也是测试电流的功能,但是精度要求很高,所有用一段时间之后,就需要校准,人工校准很麻烦,所有就考虑上位机,我原本打算用labview去实现,但是由于种种原因,就放弃了,后来了解到python可以实现,上位机既需要能用捷安特的数字万用表通信,还需要有串口功能,所以最后选择使用python开发,我也不是python开发,唯一的编程基础也是好几年前大学学的C C++ JAVA ,虽然门类多,但是学的都是皮毛,毕业后也没有做一个程序员, 所以我有对象 , 大误匿了 扯远了好像,还好python不难,各种教程资源,满天飞,所以囫囵吞枣的学两个星期,还是懂了一点了,又扯远了,直接进今天标题------线程吧,我需要开发的上位机,因为需要同时接收数字万用表的数据,还需要与测试版交互,所以决定使用多线程。以下是我的学习代码,希望对看到文章的你有所帮助 ` # -*- coding:utf-8 -*- # 开发人员:Administrator # 开发时间:2020/1/13 0:10 # 文件名称: zzz.PY # 开发工具:PyCharm # python版本:python 3.8 # 写一个程序,两个线程

1-01-Python多线程编程,线程锁

我们两清 提交于 2020-01-13 09:49:13
多线程: threading 模块创建线程 创建自己的线程类 线程通信 : 线程同步互斥方法 、 线程锁 本文说明 多线程 什么是线程?线程也是一种多任务的编程方法,可以利用计算机多核资源完成程序的并发运行。线程又被称为轻量级进程 线程的特征: 线程是计算机多核分配的最小单位 一个进程可以包含多个线程 线程也是一个运行的过程,消耗计算机资源,多个线程共享进程的资源和空间 线程的创建删除消耗的资源都远远比进程小 多个线程之间执行互不干扰 线程也有自己的特有属性,比如指令集ID threading 模块创建线程 t=threading.Thread() 功能:创建线程对象 参数: name:线程名称,如果为空则为默认值,Tread-1,Tread-2,Tread-3 target:线程函数 args:元组,给线程函数按照位置传参 kwargs:字典,给县城函数按照键值传参 t.start():启动线程,自动运行线程函数 t.join([timeout]):回收进程 t.is_alive():查看线程状态 t.name():查看线程名称 t.setName():设置线程名称 t.daemon属性:默认主线成退出不影响分支线程继续执行,如果设置为True则分支线程随着主线程一起退出 设置方法:t.daemon = True;t.setDaemon(Ture); #!/usr/bin/env

Python并发编程协程(Coroutine)之Gevent

南楼画角 提交于 2020-01-13 03:04:17
转载自https://www.cnblogs.com/zhaof/p/7536569.html event官网文档地址: http://www.gevent.org/contents.html 基本概念 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程。 在linux系统中,线程就是轻量级的进程,而我们通常也把协程称为轻量级的线程即微线程。 进程和协程 下面对比一下进程和协程的相同点和不同点: 相同点: 我们都可以把他们看做是一种执行流,执行流可以挂起,并且后面可以在你挂起的地方恢复执行,这实际上都可以看做是continuation,关于这个我们可以通过在linux上运行一个hello程序来理解: shell进程和hello进程: 开始,shell进程在运行,等待命令行的输入 执行hello程序,shell通过系统调用来执行我们的请求,这个时候系统调用会讲控制权传递给操作系统。操作系统保存shell进程的上下文,创建一个hello进程以及其上下文并将控制权给新的hello进程。 hello进程终止后,操作系统恢复shell进程的上下文,并将控制权传回给shell进程 shell进程继续等待下个命令的输入 当我们挂起一个执行流的时,我们要保存的东西: 栈, 其实在你切换前你的局部变量