多进程

Python多进程的lock机制 !

末鹿安然 提交于 2019-11-27 15:43:43
一 前言 我们知道Python中多进程是相互执行互不干扰的,但是如果多进程之间需要对同一资源对象进行操作或者多个进程之间有相互依赖的,那就需要一个共享变量供多进程使用。Python multiprocessing 多进程之间相互协调的方式有如下几种: Lock:锁,Queue:队列, Semaphore:信号量 ,Event:事件,Pipe:管道 。 后续文章会逐个介绍这几种方式,本文学习 Lock:锁 。 Python资源共享群:484031800 二 实践 当多个进程需要访问共享资源的时候,Lock可以用来避免访问的冲突。思考一个场景无事务状态下共同访问某个内存变量或者多个进程要访问读写同一个文件。 初始化lock很简单: lock = Lock() 即可创建一个锁对象, 该对象为全局对象,能被所有的子进程使用。 2.1 no lock # encoding: utf-8 """ author: yangyi@youzan.com time: 2019/8/10 5:48 PM func: """ from multiprocessing import Process, Value, Lock def sub(num): num.value += 1 if __name__ == '__main__': lock = Lock() # 创建锁对象 val = Value('i'

多进程

时光毁灭记忆、已成空白 提交于 2019-11-27 03:47:07
打印出多进程id 当进程进行文件读写操作的时候(关键性操作的时候)需要使用锁.. 来源: https://www.cnblogs.com/star6/p/11342682.html

粪发涂墙-Redis

北慕城南 提交于 2019-11-27 02:28:56
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快; 2.redis是单线程的,省去了很多上下文切换线程的时间; 3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。 下面重点介绍单线程设计和IO多路复用核心设计快的原因。 为什么Redis是单线程的 1.官方答案 因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。 2.性能指标 关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。 3.详细原因 1)不需要各种锁的性能消耗 Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除 一个对象。这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加。 总之,在单线程的情况下,就不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。 2

进程与线程

丶灬走出姿态 提交于 2019-11-26 17:31:16
进程和线程 今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务并发的执行,从而缩短程序的执行时间,同时也让用户获得更好的体验。因此在当下不管是用什么编程语言进行开发,实现让程序同时执行多个任务也就是常说的“并发编程”,应该是程序员必备技能之一。为此,我们需要先讨论两个概念,一个叫进程,一个叫线程。 概念 进程就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过fork或spawn的方式来创建新的进程来执行其他的任务,不过新的进程也有自己独立的内存空间,因此必须通过进程间通信机制(IPC,Inter-Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存区等。 一个进程还可以拥有多个并发的执行线索,简单的说就是拥有多个可以获得CPU调度的执行单元,这就是所谓的线程。由于线程在同一个进程下,它们可以共享相同的上下文,因此相对于进程而言,线程间的信息共享和通信更加容易。当然在单核CPU系统中,真正的并发是不可能的,因为在某个时刻能够获得CPU的只有唯一的一个线程

网络编程之并发多进程服务器编程

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-26 16:07:19
1. 实验目的 掌握多进程服务器的编写模板。 掌握多进程程序的编写方法。 2. 实验要求 认真阅读和掌握本实验的相关知识点。 上机编写并运行本程序。 保存程序的运行结果,并结合程序进行分析。 3. 实验内容 采用多进程并发服务器技术,服务器可以同时接受多个客户的请求。具体要求如下: 客户端: 根据客户输入的服务器IP地址,向服务器发起建立连接的请求。 接收客户输入的客户端名称,并把该客户端名称发给服务器。 接收客户输入的字符串,将字符串发送给服务器。 接收服务器发回的处理后(如何处理不做具体要求,自己可以随意发挥)的字符串并显示。继续接受客户输入的字符串,直到用户输入quit时退出。 服务器端: 接收并显示与之连接的客户端的IP,端口,名字。 接收客户端发来的字符串,显示出来,并对字符串做处理(如何处理不做具体要求,自己可以随意发挥),最后将处理后的字符串发回给客户。 4. 实验代码和结果 1. 实验代码 服务端代码: # include <stdio.h> # include <stdlib.h> # include <string.h> # include <unistd.h> # include <sys/types.h> # include <sys/socket.h> # include <netinet/in.h> # include <arpa/inet.h> #

Python 多线程

时间秒杀一切 提交于 2019-11-26 03:25:23
今天给大家说说 多进程 ! 梳理接下来的知识点: 1. 多进程的介绍 2. 多进程的特点 3. 多进程的简单使用 4. 进程直接数据交互 5. 进程直接的数据通信 6. 进程之间的内存共享 7. 进程同步 # 没写 8. 进程池 # 没写 1.多进程的介绍 在Python中,基本都知道多线程是 假 的多线程.它是在一个核上跑,并没有达到多核运算。 而且由于GIL这把超级大锁的原因,发生了很多让人无语的事情。 而且当线程多的时候,效率还不如不串行的速度快。 所以,很多人都只拿Python的多线程做 IO 处理,因为不消耗CPU嘛,到了使用CPU进行运算的时候,大家直接转用多进程。 在Python中,多线程是假的,但是多进程是真的。 这里我们科普一下进程和线程的一些问题。 每一个进程中必须有一个或一个以上的线程。 父进程和子进程,通常只是名义上的 ·父子关系· 启动一个进程,就会启动一个线程,所以,当被问到启动线程快还是启动进程快,答案是线程快。 当启动进程数量大于CPU核数,就会进行排队,比如是8核,只能同时跑8个进程,如果超出,就会被安排在 后面,当8个里面有一个结束,就会马上从排在后面的进程中放进去一个。 还有很多啦。。自己去Google啦。 2.多进程的特点 通常会有一个父进程 没有进程间内存共享那么方便 存在独立的PID 动态性 .......自己Google... 3

多线程、事件驱动与推荐引擎框架选型

社会主义新天地 提交于 2019-11-25 23:10:27
  事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。多线程是另一种常用编程范式,并且更容易理解。   高性能通用型C++网络框架 Nebula 是基于事件驱动的多进程网络框架(适用于即时通讯、数据采集、实时计算、消息推送等应用场景),已有即时通讯、埋点数据采集及实时分析的生产应用案例。经常有人问Nebula的每个进程里是单线程还是多线程的?又问为什么不用多线程?不用多线程又怎么处理并发问题?   最近 Nebula 将会用于一个新的生产项目——推荐引擎,在此之前团队已有使用某知名度较高的RPC框架多线程版推荐引擎(业界许多推荐引擎都用了目前比较知名的开源RPC框架来开发)。本文不做Nebula与各知名RPC框架的比较,也无意说明哪个框架更适合做推荐引擎,只说明Nebula可以用于推荐引擎,且有信心效果会很好。最终结果如何,等推荐引擎研发出来,拭目以待。   为什么是事件驱动而不是多线程?事件驱动无须多线程。我们先来回顾一下服务器编程范式。 1. 服务器程序设计范式   《UNIX网络编程》卷一里介绍了9种服务器设计范式:   九种服务器设计范式并不是全都有实用价值,在《UNIX网络编程》卷一最后一节里给出了几种TCP服务器设计范式代码示例: TCP并发服务器程序,每个客户一个子进程

python数据结构和GIL及多进程

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-25 20:48:19
一 数据结构和GIL 1 queue 标准库queue模块,提供FIFO的queue、LIFO的队列,优先队列 Queue 类是线程安全的,适用于多线程间安全的交换数据,内部使用了Lock和Condition 为什么说容器的大小不准确,其原因是如果不加锁,是不可能获取到准确的大小的,因为你刚读取了一个大小,还没取走,有可能被就被其他线程修改了,queue类的size虽然加了锁,但是依然不能保证立即get,put就能成功,因为读取大小和get,put方法是分来的。 2 GIL 1 简介 全局解释器锁,进程级别的锁GIL Cpython在解释器进程中有一把锁,叫做GIL全局解释器锁。 GIL 保证Cpython进程中,当前时刻只有一个线程执行代码,甚至在多核情况下,也是如此。 2 IO 密集型和CPU密集型 Cpython中 IO 密集型,由于线程阻塞,就会调度其他线程 CPU密集型,当前线程可能连续获取GIL,导致其他线程几乎无法使用CPU,若要唤醒其他线程,则需要准备数据,其代价是高昂的。 IO 密集型,多线程解决,CPU密集型,多进程解决,绕开GIL。 python中绝大多数内置数据结构的读写操作都是原子操作 由于GIL 的存在,python的内置数据类型在多线程编程的时候就变得安全了,但是实际上他们本身不是线程安全类型的 3 保留GIL 原因 Guido坚持的简单哲学