python多线程并发

python最常见的面试题~~~亲身体验(找不到工作来这看)

时间秒杀一切 提交于 2020-01-01 00:36:35
数据库的优化? 1.优化索引、SQL 语句、分析慢查询; 2.设计表的时候严格根据数据库的设计范式来设计数据库; 3.使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘 IO 4.优化硬件;采用 SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等 5.采用 MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率; 6.垂直分表;把一些不经常读的数据放在一张表里,节约磁盘 I/O; 7.主从分离读写;采用主从复制把数据库的读操作和写入操作分离开来; 8.分库分表分机器(数据量特别大),主要的的原理就是数据路由; 9.选择合适的表引擎,参数上的优化 10.进行架构级别的缓存,静态化和分布式; 11.不采用全文索引; 12.采用更快的存储方式,例如 NoSQL 存储经常访问的数据。 谈谈你对多进程,多线程,以及协程的理解,项目是否用? 这个问题被问的概率相当之大,其实多线程,多进程,在实际开发中用到的很少,除非是那些对项目性能要求特别高的,有的开发工作几年了,也确实没用过,你可以这么回答,给他扯扯什么是进程,线程(cpython 中是伪多线程)的概念就行,实在不行你就说你之前写过下载文件时,用过多线程技术,或者业余时间用过多线程写爬虫,提升效率。 进程 :一个运行的程序(代码)就是一个进程,没有运行的代码叫程序

python线程

戏子无情 提交于 2019-12-29 02:18:54
1. 线程的创建 使用threading模块能完成多任务的程序开发,为了让每个线程的封装性更完美,所以使用threading模块时,往往会定义一个新的子类class,只要继承 threading.Thread 就可以了,然后重写 run 方法 示例如下: #第一种import threading import time def saySorry(): print("============") time.sleep(1) if __name__ == "__main__": for i in range(5): t = threading.Thread(target=saySorry) t.start() #启动线程,即让线程开始执行 # 第二种import threading import time class MyThread(threading.Thread): def run(self): for i in range(3): time.sleep(1) msg = "I'm "+self.name+' @ '+str(i) #name属性中保存的是当前线程的名字 print(msg) if __name__ == '__main__': t = MyThread() t.start() 说明 python的threading.Thread类有一个run方法

Python:asyncio模块学习

匆匆过客 提交于 2019-12-27 08:32:48
python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程。无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态。使用协程可以实现高效的并发任务。Python的在3.4中引入了协程的概念,可是这个还是以生成器对象为基础,3.5则确定了协程的语法。下面将简单介绍asyncio的使用。实现协程的不仅仅是asyncio,tornado和gevent都实现了类似的功能。 event_loop 事件循环:程序开启一个无限的循环,程序员会把一些函数注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。 coroutine 协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。 task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含任务的各种状态。 future: 代表将来执行或没有执行的任务的结果。它和task上没有本质的区别 async/await 关键字:python3.5 用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。 上述的概念单独拎出来都不好懂,比较他们之间是相互联系,一起工作。下面看例子,再回溯上述概念,更利于理解。

并发编程-线程-死锁现象-GIL全局锁-线程池

孤者浪人 提交于 2019-12-27 05:39:18
一堆锁 死锁现象 (重点) 死锁指的是某个资源被占用后,一直得不到释放,导致其他需要这个资源的线程进入阻塞状态. 产生死锁的情况 对同一把互斥锁加了多次 一个共享资源,要访问必须同时具备多把锁,但是这些锁被不同线程或者进程所持有,就会导致相互等待对方释放从而程序就卡死了 第二种情况的解决方法: 抢锁一定按照相同的顺序去抢 给抢锁加上超时,如果超时则放弃执行 递归锁 (了解) 与普通的区别 相同: 多线程之间都有互斥的效果 不同: 同一个线程可以对这个锁执行多次acquire 解决方法 同一个线程必须保证,加锁的次数和解锁的次数相同,其他线程才能够抢到这把锁 信号量 (了解) 可以限制同时并执行公共代码的线程数量 如果限制数量为1,则与普通互斥锁没有区别(默认为1) from threading import Semaphore,current_thread,Thread import time s = Semaphore(2) def task(): s.acquire() time.sleep(1) print(current_thread().name) s.release() for i in range(10): Thread(target=task).start() # 结果是每次都会执行两个子线程 GIL全局锁 (重点) 什么是GIL锁? 在cpython中

python之线程

巧了我就是萌 提交于 2019-12-26 18:49:59
JoinableQueue 可以被join的队列 join是等待任务结束 队列怎么叫结束? ​ 调用task_done一次则表示有一个数据被处理完成了 当task_done次数等于put的次数就意味着任务处理完成了 ​ 这也是join的执行时机 该队列可以明确告知数据的使用方,所有数据都已经处理完成 在生产者消费者模型中,解决了消费者不知道何时算是任务结束的问题 具体过程:主进程先等待所有的生产者进程生成完毕,再等队列中的数据被全部处理,这就意味着,任务全部结束 # 多线程 ​ 使用多线程 多进程的目的 是一致 ,都是为了并发执行任务,从而提高效率 ​ 什么是线程: 线程是操作系统运算调度的最小单位 (CPU最小执行单位),线程被包含在进程中,一个线程就是一个固定的执行流程 (控制流) ​ 线程的特点: ​ 进程是不能被执行,进程是一个资源单位,其中包含了程序运行所需要的所有资源, ​ 线程才是真正的执行单位,光有进程程序是无法运行的,必须先创建进程将资源加载到进程中,在启动线程来执行任务 ​ 一个进程至少包含一个线程,称之为主线程,主线程是由操作系统来开启, ​ 一个进程可以包含多个线程,来提高程序的效率 ​ 线程与进程的区别: ​ 线程创建的开销远小于进程 ​ 统一进程中的所有线程共享进程内的资源 ​ 线程之间没有父子关系,都是平等的,PID相同 如何选择: ​

Python核心技术与实战

二次信任 提交于 2019-12-26 16:33:56
课程目录: 第00课、开篇词丨从工程的角度深入理解Python.rar 第01课、如何逐步突破,成为Python高手?.rar 第02课、Jupyter Notebook为什么是现代Python的必学技术?.rar 第03课、列表和元组,到底用哪一个?.rar 第04课、字典、集合,你真的了解吗?.rar 第05课、深入浅出字符串.rar 第06课、Python “黑箱”:输入与输出.rar 第07课、修炼基本功:条件与循环.rar 第08课、异常处理:如何提高程序的稳定性?.rar 第09课、不可或缺的自定义函数.rar 第10课、简约不简单的匿名函数.rar 第11课、面向对象(上):从生活中的类比说起.rar 第12课、面向对象(下):如何实现一个搜索引擎?.rar 第13课、搭建积木:Python 模块化.rar 第14课、答疑(一):列表和元组的内部实现是怎样的?.rar 第15课、Python对象的比较、拷贝.rar 第16课、值传递,引用传递or其他,Python里参数是如何传递的.rar 第17课、强大的装饰器.rar 第18课、[名师分享] metaclass,是潘多拉魔盒还是阿拉丁神灯?.rar 第19课、深入理解迭代器和生成器.rar 第20课、揭秘 Python 协程.rar 第21课、Python并发编程之Futures.rar 第22课

多进程(multiprocessing模块)

十年热恋 提交于 2019-12-26 12:11:22
多进程(multiprocessing模块) 多进程 一 多进程的概念 multiprocessing is a package that supports spawning processes using an API similar to the threading module. The multiprocessing package offers both local and remote concurrency,effectively side-stepping the Global Interpreter Lock by using subprocesses instead of threads. Due to this, the multiprocessing module allows the programmer to fully leverage multiple processors on a given machine. It runs on both Unix and Windows. 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包

《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池

倖福魔咒の 提交于 2019-12-26 03:41:17
一、进程间通信---队列和管道(multiprocess.Queue、multiprocess.Pipe)   进程间通信: IPC (inter-Process Communication) 1、队列 概念介绍:   创建共享的进程队列,Queue是多进程的安全的队列,可以使用Queue实现多进程之间的数据传递。 # Queue([maxsize]) 创建共享的进程队列。 参数 :maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。 底层队列使用管道和锁定实现。 # Queue([maxsize]) 创建共享的进程队列。maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。底层队列使用管道和锁定实现。另外,还需要运行支持线程以便队列中的数据传输到底层管道中。 Queue的实例q具有以下方法: q.get( [ block [ ,timeout ] ] ) 返回q中的一个项目。如果q为空,此方法将阻塞,直到队列中有项目可用为止。block用于控制阻塞行为,默认为True. 如果设置为False,将引发Queue.Empty异常(定义在Queue模块中)。timeout是可选超时时间,用在阻塞模式中。如果在制定的时间间隔内没有项目变为可用,将引发Queue.Empty异常。 q.get_nowait( ) 同q.get(False)方法。 q.put

python并发编程之多进程、多线程、异步、协程、通信队列Queue和池Pool的实现和应用

余生颓废 提交于 2019-12-26 00:47:31
什么是多任务? 简单地说,就是操作系统可以同时运行多个任务。实现多任务有多种方式, 线程、进程、协程。 并行和并发的区别? 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已) 并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的 真的多任务叫并行,假的多任务叫并发 。 我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务。 一个CPU,在一个时间切片里只能运行一个程序。 从操作系统的角度: 进程和线程,都是一种CPU的执行单元。 进程:表示一个程序的上下文执行活动(打开、执行、保存...) 线程:进程执行程序时候的最小调度单位(执行a,执行b...),可以简单理解为同一进程中有多个计数器,每个线程的执行时间不确定,而每个进程的时间片相等, 线程是操作系统调度执行的最小单位 一个程序至少有一个进程,一个进程至少有一个线程。 多进程/多线程: 表示可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。 进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。 进程之间的通信有操作系统传递,导致通讯效率低,切换开销大。 进程是系统进行资源分配的最小单位 线程:一个进程可以有多个线程

python中的多线程和多进程编程

南楼画角 提交于 2019-12-26 00:46:58
注意:多线程和多线程编程是不同的!!! 第一点:一个进程相当于一个要执行的程序,它会开启一个主线程,多线程的话就会再开启多个子线程;而多进程的话就是一个进程同时在多个核上进行; 第二点:多线程是一种并发操作(伪并行),它相当于把CPU的时间片分成一段一段很小的片段,然后分给各个线程交替进行,由于每个片段都很短,所以看上去像平行操作; (1)多线程操作案例: import threading class MyThread(threading.Thread): def __init__(self , thread_ID , thread_name , person_list): threading.Thread.__init__(self) self.thread_ID = thread_ID self.thread_name = thread_name self.person_list = person_list def run(self): print("开始进程:" + self.thread_name) main(self.person_list , self.thread_name) #main是自定义要进行多线程操作的函数 print("结束进程:" + self.thread_name) def main(person_list , thread_name): .....