python多线程

python中线程共享资源问题的解决

和自甴很熟 提交于 2019-12-02 16:45:15
线程跟进程有些相似,有时被称作轻量级的进程,但不同的是,所有的线程运行在同一个进程中,共享相同的运行坏境。 进程和线程都是实现多任务的一种方式,例如:在同一台计算机上能同时运行多个QQ(进程),一个QQ可以打开多个聊天窗口(线程)。 资源共享:进程不能共享资源,而线程共享所在进程的地址空间和其他资源,同时,线程有自己 来源: https://www.cnblogs.com/tanshengjiang/p/11755509.html

day30总结

青春壹個敷衍的年華 提交于 2019-12-02 16:02:08
目录 多线程实现TCP服务端并发 服务端---封装接口思想 GIL全局解释器锁 什么是GIL?---global interpreter lock 为什么要有GIL? 死锁问题及解决 死锁问题 解决:递归锁 信号量 多线程实现TCP服务端并发 服务端---封装接口思想 import threading import socket def server_interface(): server = socket.socket() server.bind(('127.0.0.1', 8888)) server.listen() def multi_handle(): new_server_link, address = server.accept() print(address) while True: try: res = new_server_link.recv(1024).decode('utf-8') print(res) new_server_link.send(res.upper().encode('utf-8')) if res == 'q': return except Exception as e: print(e) return for i in range(10): t = threading.Thread(target=multi_handle) t.start(

python中的GIL锁与线程互斥锁的区别

陌路散爱 提交于 2019-12-02 15:08:59
python中的GIL锁与线程互斥锁的区别 GIL锁: GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定。某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行。GIL只在cpython中才有。 互斥锁 那么多线程编程时通过调用threading模块的Lock函数,来获取一把互斥锁。 互斥锁就是对共享数据进行锁定,保证同一时刻只有一个线程操作数据。 GIL锁的释放 在python3.x中,GIL不使用ticks计数,改为使用计时器(执行时间达到阈值后,当前线程释放GIL),这样对CPU密集型程序更加友好,但依然没有解决GIL导致的同一时间只能执行一个线程的问题,所以效率依然不尽如人意。 那么下来用代码来解释互斥锁与GIL锁的区别 假设有这样一个场景: import threading # 定义全局变量 g_num = 0 # 循环一次给全局变量加1 def sum_num1 ( ) : for i in range ( 1000000 ) : global g_num g_num += 1 print ( "sum1:" , g_num ) # 循环一次给全局变量加1 def sum_num2

线程池线程数目的确定

雨燕双飞 提交于 2019-12-02 11:26:03
在上一篇文章 《java线程的创建(重点:线程池的使用,线程池不允许使用Executors创建)》 中有关线程池的配置中, public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) { ...... } 缓冲队列queue和异常处理策略handler已经说明,但还有两个重要的参数设置: 核心线程数corePoolSize,最大线程数maximumPoolSize 。所以线程数的确定也很重要,下面是我查阅资料和自己理解的结果 线程和哪些因素有关? 1. CPU 在最开始介绍多线程 《多线程的由浅及深》 时,介绍到 线程共享进程的上下文环境,为更细粒度的CPU时间段 。所以线程数的确定和CPU有关。至于CPU的核数和线程数的关系,可以查看这篇文章: CPU的核心数、线程数的关系和区别 。(多线程实际上是计算机多种资源的并行运用,跟CPU有几个核心是没什么关系的) 2. IO IO分为磁盘IO和网络IO。影响磁盘的关键因数是磁盘服务时间,即磁盘完成一个I/O请求所花费的时间,它由寻道时间

网络编程面试题整理(三)

回眸只為那壹抹淺笑 提交于 2019-12-02 10:44:17
1: 什么是并发和并行? 并发是指一个处理器同时处理多个任务。并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。 2: 进程锁和线程锁的作用? 线程锁: 大家都不陌生,主要用来给方法、代码块加锁。当某个方法或者代码块使用锁时,那么在同一时刻至多仅有一个线程在执行该段代码。当有多个线程访问同一对象的加锁方法 / 代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该代码段。 但是,其余线程是可以访问该对象中的非加锁代码块的。    进程锁: 也是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的, 但是可以使用本地系统的信号量控制(操作系统基本知识)。 3: 解释什么是异步非阻塞? 首先需要知道什么是同步和异步: 同步和异步 是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。同步方法表明调用一旦开始,调用者必须等待方法执行完成,才能继续执行后续方法。异步方法表明,方法一旦开始,立即返回,调用者无需等待其中方法执行完成,就可以继续执行后续方法

网络编程(目录)

孤人 提交于 2019-12-02 07:03:45
一、网络编程 1. 网络编程 2. TCP协议三次握手四次挥手 3. 基于TCP的套接字编程 4. 模拟ssh发送cmd指令 5. 粘包问题 6. UDP协议套接字编程,socketserver实现高并发 二、并发编程 7. 并发编程(理论) 8. Python如何使用多线程 9. 守护进程,互斥锁 10. IPC和队列Queue 11. 生产者消费者模型 12. 多线程 13. 死锁现象,递归所,信号量,GIL 14. 线程池与进程池,同步异步,Event事件 15. 鱼还是熊掌:浅谈多进程多线程的选择 16. 线程队列,协程基础 17. IO模型(多路复用IO) 18. select的问题以及epoll的使用 来源: https://www.cnblogs.com/lucky75/p/11735790.html

第三十一天

那年仲夏 提交于 2019-12-02 06:53:35
目录 Event事件 什么是Event事件 怎么使用 wait set 进程池和线程池 什么时进程池什么是线程池 使用方法 协程 什么是协程 怎么实现协程 Event事件 什么是Event事件 Event是python的threading模块中的一个类,它的作用是可以通过一些线程来控制另一些线程。 怎么使用 因为它是一个类,所以首先需要先实例化一个对象,通过对象来调用它的一些方法 wait 该方法可以将线程变为false,即阻塞状态 set 它可以将wait方法改变的线程重新变为就绪和执行 from threading improt Event,Thread import time def light(): print('红灯亮了。。') time.sleep(5) # 让汽车线程进入运行或就绪状态 e.set() print('绿灯亮了。。') def car(name): print('等待红灯中。。') # 红灯时让线程进入等待状态 e.wait() print(f'{name}开始行驶') # 开启一个灯线程 t = Thread(target=light) t.start() # 开启十个汽车线程 for name in range(10): t = Thread(target=car,args=(f'汽车{name}号',)) t.start() 进程池和线程池

1024 笔记

孤人 提交于 2019-12-02 06:51:06
目录 1. Event事件 定义 方法 2. 进程池与线程池 定义 作用 使用 进程池 线程池 3. 协程 定义 代码实现 4. TCP服务端实现协程 5. IO模型 1. Event事件 定义 Event事件的作用: 用来控制线程 事件处理的机制:全局定义了一个内置标志Flag,如果Flag值为 False,那么当程序执行 event.wait方法时就会阻塞,如果Flag值为True,那么event.wait 方法时便不再阻塞。 方法 set() : 将标志设为True,使处于阻塞状态的线程恢复运行状态。 wait() : 如果标志为True将立即返回,否则线程阻塞(可传时间) clear(): 将标志设为False。 isSet() : 获取内置标志状态,返回True或False。 from threading import Event import time from threading import Thread # 调用Event类实例化一个对象 e = Event() def light(): print('红灯亮...') time.sleep(5) # 发送信号true,其他所有进程准备执行 e.set() # flag变为true ,阻塞态变为运行 print('绿灯亮...') def car(name): print('正在等红灯...') #

协程课堂小结day31

我怕爱的太早我们不能终老 提交于 2019-12-02 06:40:49
昨日回顾 GIL全局解释锁 python解释器 Cpython(C语言编写) Jpython(Java编写) Ppython(Python编写) GIL全局解释锁 基于CPython来研究全局解释器锁,因为CPython的内存线程不是安全的 GIL本质上是一个互斥锁 GIL是为了阻止同一个进程内多个线程同时执行(并行) GIL的存在就是为了保证线程安全 注意:多个线程过来执行,一旦遇到IO操作,就会立马释放GIL解释器锁,交给下一个先进来的线程 多线程的作用 计算密集型程序 在单核情况下,若一个任务需要10s 开启进程,消耗资源大,执行4个进程需要40s 开启线程,消耗资源小,执行4个线程需要40s 在多核情况下,若一个任务需要10s 开启进程,并行执行,效率较高,执行4个进程需要10s 开启线程,并发执行,效率较低,执行4个线程需要40s IO密集型程序 在单核情况下,若一个任务需要10s 开启进程,消耗资源大,执行4个进程需要40s 开启线程,消耗资源小,执行4个线程需要40s 在多核情况下,若一个任务需要10s 开启进程,并行执行,效率小于线程,因为遇到IO会立即切换CPU执行权限,执行4个进程需要10s = 开启进程的额外时间 开启线程,并发执行,效率高于进程,执行4个线程需要40s 死锁现象 死锁是指两个或两个以上的进程或线程在执行过程中

协程

混江龙づ霸主 提交于 2019-12-02 06:18:28
Event 用来控制线程的执行 有一些线程去控制另一些线程 Event对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生 初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。 一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程 线程特性: 每个线程都是独立运行且状态不可预测 from threading import Event event.isSet() # 判断event 的状态值, event.wait() # 当event.isSet() == Fadlse,将阻塞线程 event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度; event.clear():恢复event的状态值为False Timer : --定时器 from threading import Timer def hello(): print('hello world') t = Timer(9,hello) # 时间 t.start() 线程池 / 进程池: 问题 : 服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这会对服务端主机带来巨大的压力,甚至于不堪重负而瘫痪