多进程

15 python学习笔记-多进程multiprocessing

a 夏天 提交于 2019-11-28 21:27:03
上篇介绍了Python的多线程,python的多线程是不能利用多核CPU的,如果想利用多核CPU的话,就得使用多进程。python中多进程使用multiprocessing模块。 1、python多进程实例如下: 1 import multiprocessing,time 2 def down_load(): 3 time.sleep(1) 4 print("运行完了") 5 6 if __name__ == '__main__': 7 start_time=time.time() 8 for i in range(5): 9 p = multiprocessing.Process(target=down_load) #创建一个进程 10 p.start() #启动进程 11 while len(multiprocessing.active_children())!=0:#等待子进程结束,效果同于join 12 pass 13 end_time=time.time() 14 print(multiprocessing.current_process()) #输出当前运行的线程 15 print(end_time-start_time) 16 print('end')=======================================执行结果================

六大高并发模型

醉酒当歌 提交于 2019-11-28 20:16:04
文章目录 1.多进程 2.多线程 3.线程池 4.select、poll、epoll 1.多进程 缺点: 启动和关闭子进程带来很大的开销 系统创建线程有上限 命令:ulimit -u 简单实现 2.多线程 缺点:与多进程相似 简单实现 3.线程池 基本思想: 事先创建一定数量的工作线程,当任务队列中有任务时就唤醒阻塞等待的工作线程; 用 来源: https://blog.csdn.net/zxt_1/article/details/87891799

线程和进程(二)

放肆的年华 提交于 2019-11-28 19:33:17
线程和进程的优缺点: 首先,要实现多任务,通常我们会设计Master-Worker模式,Master负责分配任务,Worker负责执行任务,因此,多任务环境下,通常是一个Master,多个Worker。 如果用多进程实现Master-Worker,主进程就是Master,其他进程就是Worker。 如果用多线程实现Master-Worker,主线程就是Master,其他线程就是Worker。 多进程模式最大的优点就是稳定性高,因为一个子进程崩溃了,不会影响主进程和其他子进程。(当然主进程挂了所有进程就全挂了,但是Master进程只负责分配任务,挂掉的概率低)著名的Apache最早就是采用多进程模式。 多进程模式的缺点是创建进程的代价大,在Unix/Linux系统下,用 fork 调用还行,在Windows下创建进程开销巨大。另外,操作系统能同时运行的进程数也是有限的,在内存和CPU的限制下,如果有几千个进程同时运行,操作系统连调度都会成问题。 多线程模式通常比多进程快一点,但是也快不到哪去,而且,多线程模式致命的缺点就是任何一个线程挂掉都可能直接造成整个进程崩溃,因为所有线程共享进程的内存。在Windows上,如果一个线程执行的代码出了问题,你经常可以看到这样的提示:“该程序执行了非法操作,即将关闭”,其实往往是某个线程出了问题,但是操作系统会强制结束整个进程。 在Windows下

python数据结构和GIL及多进程

你离开我真会死。 提交于 2019-11-28 14:45:07
一 数据结构和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坚持的简单哲学

NodeJs中的异步

五迷三道 提交于 2019-11-28 13:24:32
原文引用 https://www.dazhuanlan.com/2019/08/25/5d625d714f62a/ 这篇文章主要讨论NodeJs中的异步问题。使用NodeJs编写进程也一年多了,在公司实习的时候,公司两个项目的后台都是我负责使用NodeJs和Sails框架编写的。工作模式主要是我在服务器端提供RESTful接口,网页端通过AJAX方式获取服务端的数据。在做的过程中,遇到了许多问题,感触最深的是异步编程的思维习惯还不是适应的很好。 异步背景 其实,异步很早都有了,例如在操作系统中就有异步的概念。后来随着Ajax技术的普及,前端的开发人员最了解异步这个概念。随着谷歌的Chrome浏览器的V8的推出,出现了以异步方式处理网络请求的Nginx服务器,时间证明,Nginx的并发性能比Apache,Tomcat等更出色。在V8推出后,Ryan Dahl就推出了NodeJs,第一个在语言平台完全支持NodeJs的技术。当然Java,PHP等也都支持异步方式的编程,但是那都是在Java语言的基础上通过多线程及线程间的通信上实现的。而NodeJs在语言的实现上就是以异步的思想为基础的。 异步的实现 要讲异步,就得了解阻塞IO与非阻塞IO。 阻塞IO我们很好理解,因为在平常的编程中,我们经常读写文档,例如在C语言中我们使用 open 函数打开一个比较大的文档,那么这个时候进程就会阻塞住

python3中的多任务编程

只愿长相守 提交于 2019-11-28 12:49:02
python中子线程如何向父线程回传参数呢? 答:最基础的方法是在单文件的开头定义一个全局变量,再加一个锁,就可以父进程、子进程共享一个变量了。 在一个单核CPU上,要同时跑多个任务,比如在写文档的同时听歌,就可以使用多进程的技术。每个任务就是一个进程(Pocess)。多进程就是交替的使用CPU的一段运行时间,当交替的很快,多个进程看起来就跟在同时执行一样。在一个任务背后,又可能需要同时执行多个子任务,这时每个子任务被称为线程(Thread)。线程的并发也是交替使用CPU。 当我们要同时执行多个任务,可以启用多个进程或线程。多个任务之间往往是需要通信和协调的,这也是同时执行多任务的难点所在。 就我自己执行的任务来说,我在一个mininet(仿真软件)的进程中开启多个线程,以实现多任务。所谓的多任务,是要模拟多台主机同时产生流量的一个过程。每台主机按照一定规律产生流量,在同一时间,这些流量的汇聚结果也就是我需要观察的内容。 在这个过程中,容易的点在于这多个主机相互独立的产生流量,并不存在一个主机要等在另一个主机后产生流量,或者说这个主机产生的流量大小要和另一个主机的流量大小成正比。在其中有一个小小的约束条件,就是等待所有的主机停止产生流量后,才能进行相关的统计。因此在使用过程中用了线程锁,每当一个主机停止产生流量,就解锁一个对应的线程锁。所有线程锁解锁后,才能进行统计。 问

IO复用

橙三吉。 提交于 2019-11-28 10:55:22
IO复用: MariaDB PerconaDB web :Nginx , LNMP, Memcached ,tomcat ,varnish www.nginx.org 官方站点 Nginx pronounced engine-x HTTP服务器 反向代理 :reverse proxy 反向代理的协议 http mail netcraft 网站 web市场占有率 Nginx优势 : 高性能 稳定性 丰富的特性 简单配置 低资源消耗 多进程模型 进程切换 阻塞状态 不可中断睡眠 DMA 直接内存访问 C10K 单进程 :阻塞 多进程 :每个进程响应一个请求 进程量大。进程切换次数过多 每个进程的地址空间是独立,很多空间是重复的数据,所以内存使用效率较低 线程 :thread, Light Weight Process, LWP 每个线程响应一个请求 线程依然需要切换,切换较之进程轻量级 同一个进程的线程可以共享进程的诸多资源,比如打开的文件 对内存的需求较之进程略有下降 快速切换时会带来线程抖动 忙等 :自旋锁 Spin lock 闲等 多进程多线程模型: 多线程:n个请求 一个线程响应多个请求 select(1024) AIO :异步IO 同步通信 异步通信 多路IO,IO复用 来源: https://blog.51cto.com/14087650/2432310

线程锁与其他用法

廉价感情. 提交于 2019-11-28 08:35:49
一、死锁与递归锁 死锁的现象归根在于函数功能中含有连续锁,并且,各个锁的加锁与解锁时存在一定的时间差。当多个此类函数出现加锁的次序不一致时,当不同进程/线程调用这些函数,可能因为首次抢得锁的进程/线程释放锁的次序不同,导致其他进程/线程抢得锁的样式也不一致,无法在一个功能函数中连续使用,出现死锁。 优点:针对性加锁,每把锁赋予不同的权限,便于把控函数进程。 缺点:不同功能函数可能因为功能逻辑需要,加锁次序不同,但是在线程在调用多个函数时,就会可能出现死锁现象,注意点较多,无法完成对应加锁解锁,降低的使用效率与准确度。 递归锁: 为了解决死锁现象,引入了递归锁。 递归锁符号: from threading import RLock lock_A=lock_B=RLock() 大致原理是,初始化时,将所有的锁同等看待。不计锁的类型只计加锁解锁的次数。初始化时,默认加锁次数为0,函数每经过一次加锁,计数增加1,每解一次锁,技术减去1。当加锁次数回归到0时,说明函数处于可被多个进程/线程争抢调用阶段。 优势:将所有的锁的一视同仁,不必对应加解同类型的锁,只需考虑加锁次数。在进程/线程调用函数时,方便检测与使用。 缺点:但是锁的针对性较差。无法有针对性的加锁。 二、GIL全局锁 因为同一线程总的数据是共享的,为了保证数据的安全性与稳定,python在早期开发的时候,因为当时的CPU只有一核

线程与进程,多线程,多进程,线程并发,线程并行

只谈情不闲聊 提交于 2019-11-28 08:23:49
一、线程、进程概念: 进程:是程序的一次运行活动,是 系统 资源分配和调度的一个独立单位,有独立的地址空间和系统资源。 线程:“轻量级进程”,是进程的一个实体,是 CPU 调度的基本单位。多个线程共享同一个进程的资源。 二、引入线程的好处 (1)线程占用资源要比进程少的多 (2)创建一个新的线程花费的代价小 (3)切换线程方便 (4)提高并发性 三、多线程 多线程举例:比如用浏览器,同时进行浏览网页、播放视频、下载资源、听音乐等操作 多线程缺点: 多线程比多进程成本低,不过 性能 也更低 一个线程的崩溃可能影响到整个程序的 稳定 性 线程多了之后,线程本身的 调度 也麻烦,需要消耗较多的CPU 无法直接获取系统的资源,总体能够达到的性能 上限 有限制 线程之间的同步和加锁 控制比较麻烦 四、 多进程 多进程举例:比如同时运行QQ、微信、截图工具、视频播放器等 多进程优点: 每个进程互相独立,子进程崩溃不影响主程序的稳定性 通过增加CPU,就可以容易扩充性能 进程能直接获取系统的资源,总体能够达到的性能上限非常大 五、同一进程的线程共享哪些资源? a. 堆 由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的) b. 全局变量 它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的 c.

基于pcntl的PHP进程池

女生的网名这么多〃 提交于 2019-11-27 18:48:43
想必大家都知道可以通过多进程或者多线程的方式实现异步。 PHP多进程编程当前主要有这几种方式, 1>基于pcntl实现多进程,这也是PHP自带的多进程玩法 2>Swoole自己修改PHP内核代码,从而实现多进程,这个看起来比较新 PHP基于pcntl封装的多进程或者进程池也有很多第三方库,今天分享下sinple_fork这个库,实现了多进程和进程池。 一,安装 用composer安装。 composer require jenner/simple_fork 二,使用 simple_fork这个库自带了很多内容,在此主要跟大家分享进程和进程池的使用,其他内容可以自行查看demo。 没有用过composer的朋友,需要根据自己的代码路径,导入autoload.php,在此略过。 需要在命令行下运行。 1,进程 使用步骤大致如下: #1,任务是一个实现了Runnable接口的类,或者直接用callback也可以。 #2,初始化子进程Process,并把任务实例作为参数传递过去 #3,最后start开启子进程,wait用于等待子进程运行结束(否则会出现僵尸进程)。 用起来也很简单 use Jenner\SimpleFork\Runnable;use Jenner\SimpleFork\Process; class Task implements Runnable { /** *