多进程

Python标准库11 多进程探索 (multiprocessing包)

徘徊边缘 提交于 2019-12-03 17:51:26
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 在 初步了解Python多进程 之后,我们可以继续探索multiprocessing包中更加高级的工具。这些工具可以让我们更加便利地实现多进程。 进程池 进程池 ( Process Pool )可以创建 多个进程 。这些进程就像是随时待命的士兵,准备执行任务(程序)。一个进程池中可以容纳多个待命的士兵。 “三个进程的进程池” 比如下面的程序: import multiprocessing as mul def f(x): return x**2 pool = mul.Pool(5) rel = pool.map(f,[1,2,3,4,5,6,7,8,9,10]) print(rel) 我们创建了一个容许5个进程的进程池 (Process Pool) 。Pool运行的每个进程都执行f()函数。我们利用 map() 方法,将f()函数作用到表的每个元素上。这与 built-in的map()函数 类似,只是这里用5个进程 并行 处理。如果进程运行结束后,还有需要处理的元素,那么的进程会被用于重新运行f()函数。除了map()方法外,Pool还有下面的常用方法。 apply_async( func,args ) 从进程池中取出一个进程执行func,args为func的参数

并发编程 ~~~ 多进程

僤鯓⒐⒋嵵緔 提交于 2019-12-03 15:25:46
一 进程 程序: 一堆静态的代码文件 进程: 一个正在运行的程序 (由操作系统操控调用交于CPU运行) 串行: 所有的任务一个一个的完成 并行: 多个CPU执行多个任务,真正的同时进行 并发: 一个CPU完成多个任务,看起来像是同时进行 阻塞: CPU遇到I/O就是阻塞 非阻塞: 没有I/O 进程的创建 : 一个子进程必须依赖于一个主进程才可以开启 一个主进程可以开启多个子进程 Unix: fork创建子进程 Unix(linux,mac): 创建一个子进程会完完全全复制一个主进程所有的资源,初始资源不变 Windows: 操作系统调用CreateProcess处理进程的创建. Windows: 创建一个子进程会复制主进程所有的资源,但会改变一些资源 进程的状态: 就绪 运行 阻塞 二 操作系统 操作系统: 管理控制协调计算机中硬件与软件的关系. 操作系统的作用: 将一些对硬件操作的复杂丑陋的接口变成简单美丽的接口 多个进程抢占一个(CPU)资源时,操作系统会将你的执行变得合理有序 多道技术: 解决多个程序竞争或者说共享同一个资源(比如cpu)的有序调度问题,解决方式即多路复用,多路复用分为时间上的复用和空间上的复用。 空间上的复用: 将内存分区域,一个内存可以同时加载多个进程. 时间上的复用: 实现将CPU在多个进程之间来回切换,并且保留状态. 来源: https://www

重述协程

给你一囗甜甜゛ 提交于 2019-12-03 12:08:11
重述协程 之前知道的,可以开多进程,每个进程又可以开多线程,线程又可以开协程,多进程可以占用多个cpu的核,一个进程同时只能占用一个核,因为每个进程默认有一个主线程,由于存在GIL全局解释器锁,所以导致了多线程也只能占用一个核。 什么是协程? 协程就是把多个任务都放在一个线程下面跑,计算密集型没用,甚至更差,io密集型有用,他可以用模块自动实现在遇到io的时候再任务间切换,而不被操作系统发现,尽可能长时间的占用cpu。 什么时候用多进程? 有多核,而且任务是计算密集型的时候。这样可以并行的去执行这些任务,如果是io密集型的话,浪费了开启多进程的资源,因为io的时候cpu是不执行的。 什么时候用多线程? 需要对同一个内存空间进行操作时,io密集型任务。 什么时候用协程? 当任务是io密集型的时候。 为什么不用多线程而用协程? 1、因为协程的切换是在应用程序之间切换,和多线程的cpu的切换相比起来快得多。 2、协程是在一个线程下的,意味着他已经拿到了线程锁,比如这时候有三个一样的任务都是循环200000次 x = x+1 ,因为协程中任务之间的切换是遇到io才会切换的,所以在循环的时候不会切换,就算这个时候占用cpu时间过长,而导致cpu切换到其他线程上,协程也会保留当前的状态,下次cpu再切到这里的时候继续运行。(总而言之,不需要锁了) 3、尽可能让cpu停留在自己的线程上

【linux下c语言服务器开发系列5】功能齐全的聊天室 sever [IO复用+多进程+信号处...

*爱你&永不变心* 提交于 2019-12-03 01:03:41
上个博客的最后,说要写一个功能齐全一些服务器,所以,这边博客主要对这个服务器进行一个简单的介绍。这个服务器,是一个聊天室服务器。 当客户端连接到服务器后,就可以收到所有其他客户端发送给服务器的内容。主要实现原理如下: 1.IO复用: 利用epoll函数,对多个套接字进行监听,包括:listenfd,标准输入套接字,与子进程通讯的套接字还有信号处理的套接字。 listenfd:这个套接字主要是服务器端用来监听是否有新的客户端的连接的。一旦有连接,则视为新的客户到来,然后,准备连接,分配用户内存,对应各种信息,连接成功后,fork一个子进程进行对这个连接进行一对一的处理。这里的处理,主要是对各种套接字进行监听,并进行相应的处理,下文的多进程部分会有。 标准输入套接字:为的是在服务器端也能输入一些信息,并让这个服务器根据输入的信息进行反应。不过,我这里的反应主要是让服务器原样输出。 与子进程通讯的套接字:因为没个客户,都是用一个子进程在单独的处理,各个子进程之间的通信,首先需要通过父进程,然后再进行广播,从而实现子进程与其他所有子进程之间的通信。这里,子进程与父进程之间的通信,是靠管道完成的。但是,传统的管道是pipe()函数创建的,只能单工的通信,我这里为了双工的通信,使用的是socketpair()创建的管道,管道的两端都可以进行读写操作。如果子进程有数据写给父进程

多线程与多进程的理解

匿名 (未验证) 提交于 2019-12-03 00:40:02
参考https://www.liaoxuefeng.com/ 线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。 多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。 在 Unix / Linux 下,可以使用 fork ()调用实现多进程。 要实现跨平台的多进程,可以使用 multiprocessing 模块。 进程间通信是通过 Queue 、 Pipes 等实现的 多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。 因为 Python 的线程虽然是真正的线程,但解释器执行代码时,有一个 GIL 锁: Global Interpreter Lock ,任何 Python 线程执行前,必须先获得 GIL 锁,然后,每执行 100 条字节码,解释器就自动释放 GIL 锁,让别的线程有机会执行。这个 GIL 全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在 Python 中只能交替执行,即使 100 个线程跑在 100 核 CPU 上,也只能用到 1 个核。 不过,也不用过于担心,

MapReduce多进程和spark多线程

匿名 (未验证) 提交于 2019-12-03 00:38:01
1,首先要区分分布式概念,分布式指的是将一个任务切分成多块分到多台机器运行. 2,进程可以理解成该服务器分到的那一块任务(MapReduce每分到一个任务会重启一个进程,而spark的所有任务都只在一个进程中,每来一个任务启动一个线程.) 3,线程可以理解成在进程的基础之上又细分的更小的任务 4,在任务级别(特指Spark任务和MapReduce任务)上却采用了不同的并行机制:Hadoop MapReduce采用了多进程模型,而Spark采用了多线程模型 5,多进程模型便于细粒度控制每个任务占用的资源,但会消耗较多的启动时间,不适合运行低延迟类型的作业,这是MapReduce广为诟病的原因之一。而多线程模型则相反,该模型使得Spark很适合运行低延迟类型的作业。总之,Spark同节点上的任务以多线程的方式运行在一个JVM进程中,可带来以下好处: 1)任务启动速度快,与之相反的是MapReduce Task进程的慢启动速度,通常需要1s左右; 2)同节点上所有任务运行在一个进程中,有利于共享内存。这非常适合内存密集型任务,尤其对于那些需要加载大量词典的应用程序,可大大节省内存。 3)同节点上所有任务可运行在一个JVM进程(Executor)中,且Executor所占资源可连续被多批任务使用,不会在运行部分任务后释放掉,这避免了每个任务重复申请资源带来的时间开销

多进程多线程更新信息

匿名 (未验证) 提交于 2019-12-03 00:28:02
import openpyxl from concurrent . futures import ThreadPoolExecutor from concurrent . futures import ProcessPoolExecutor import time # 创建数据更新函数 def update ( name , price ): filename = '/root/Desktop/table2.xlsx' wb = openpyxl . load_workbook ( filename ) sheet = wb . active try : for index , row in enumerate ( sheet . rows ): produceName = sheet . cell ( row = index + 1 , column = 1 ). value if produceName == name : sheet . cell ( row = index + 1 , column = 2 , value = price ) except Exception as e : print ( e ) else : wb . save ( filename = filename ) # 多线程更新信息 # start = time.time() # with

面试题

匿名 (未验证) 提交于 2019-12-03 00:27:02
我们按照多个不同的维度,来看看多线程和多进程的对比(注:因为是感性的比较,因此都是相对的,不是说一个好得不得了,另外一个差的无法忍受)。 对比维度 多进程 多线程 总结 数据共享、同步 数据共享复杂,需要用IPC;数据是分开的,同步简单 因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂 各有优势 内存、CPU 占用内存多,切换复杂,CPU利用率低 占用内存少,切换简单,CPU利用率高 线程占优 创建销毁、切换 创建销毁、切换复杂,速度慢 创建销毁、切换简单,速度很快 线程占优 编程、调试 编程简单,调试简单 编程复杂,调试复杂 进程占优 可靠性 进程间不会互相影响 一个线程挂掉将导致整个进程挂掉 进程占优 分布式 适应于 多核、多机 分布式;如果一台机器不够,扩展到多台机器比较简单 适应于 多核 分布式 进程占优 1 )需要频繁创建销毁的优先用线程 原因请看上面的对比。 这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的 2 )需要进行大量计算的优先使用线程 所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。 这种原则最常见的是图像处理、算法处理。 3 )强相关的处理用线程,弱相关的处理用进程 什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。

多进程Application (多次启动的问题)

匿名 (未验证) 提交于 2019-12-03 00:22:01
多进程Application: 有多个进程执行,每个进程的启动,都会调用一次 Application 关于Application 的 onCreate()方法执行多次的问题 在application 的onCreate()方法中打印log,你会发现,有时会执行多次,这样带来的问题: 1.浪费资源 2.对性能造成影响 3.处理不好可能导致bug 多次调用的原因: Application多进程的问题,应用每启动一个新进程,就会调用一次Application的onCreate()方法。 常见例子: 1.一些第三方框架可能是一个独立的进程,那么你集成了该框架,就会出现多次调用Application的onCreate()方法的问题。 2.项目中将组建设置该属性 android : process= ” .zxxqpl” ,如图 t1 解决方法 : 可以通过pid来判断,避免非主进程执行没必要的业务,造成资源浪费。 t2 文章来源: 多进程Application (多次启动的问题)

多进程,多线程

匿名 (未验证) 提交于 2019-12-03 00:18:01
多任务编程: 多进程,多线程 进程的状态:             就绪态: 2,多个进程,如何占用cpu: 3,进程有哪些信息,如何保存 文章来源: 多进程,多线程