python之多线程与多进程
1. 多进程与多线程
(1)背景:为何需要多进程或者多线程:
在同一时间里,同一个计算机系统中如果允许两个或者两个以上的进程处于运行状态,这便是多任务。多任务会带来的好处例如用户边听歌、边上网、边打印,而这些任务之间丝毫不会互相干扰。使用多进程技术,可大大提高计算机的运算速率。
(2)多进程与多线程的区别:
进程:程序在计算机上的一次执行活动。进程分为:系统进程和用户进程。
当运行一个程序时,实际就是启动了一个进程。程序是死的(静态的),进程是活的(动态的)。
线程:是程序中的一个单一的顺序控制流程。
进程是一个相互独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单元(指运行中程序的调度单位)。
区别:进程是资源分配的最小单位,线程是CPU调度的最小单位。
线程是一个进程的实体,是由表示程序运行状态的寄存器(如程序计数器、栈指针)以及堆栈组成,它是比进程更小的单位。
线程是程序中的一个执行流。一个执行流是由CPU运行程序代码并操作程序的数据所形成的。因此,线程被认为是以CPU为主体的行为。
线程不包含进程地址空间中的代码和数据,线程是计算过程在某一时刻的状态。所以,系统在产生一个线程或各个线程之间切换时,负担要比进程小得多。
线程是一个用户级的实体,线程结构驻留在用户空间中,能够被普通的用户级函数直接访问。
一个线程本身不是程序,它必须运行于一个程序(进程)之中。因此,线程可以定义为一个程序中的单个执行流。
多线程是指一个程序中包含多个执行流,多线程是实现并发的一种有效手段。一个进程在其执行过程中,可以产生多个线程,形成多个执行流。每个执行流即每个线程也有它自身的产生、存在和消亡的过程。
多线程程序设计的含义就是可以将程序任务分成几个并行的子任务。
在Windows系统中,进行CPU分配是以线程为单位的,一个进程可能由多个线程组成,这种情况更加复杂,有如下关系:
总线程数<=CPU数量,并行运行
总线程数>CPU数量,并发运行。 并行运行的效率明显高于并发运行。
2. 多进程编程
- 进程的概念
第一,进程是一个实体,每一个进程都有它自己的地址空间,一般情况下,包括文本区域、数据区域和堆栈区域。
文本区域:存储处理器执行的代码;
数据区域:存储变量和进程执行期间使用的动态分配的内存.
堆栈区域:存储着活动过程中调用的指令和本地变量。
第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,称其为进程。
- 进程的特征
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生、动态消亡的;
并发性:任何进程都可以同其他进程一起并发执行。
独立性:进程是一个能够独立运行的基本单元,同时也是系统分配资源和调度的独立单元;
异步性:进程间的相互制约,使得进程具有执行的间断性。
结构特征:进程由程序、数据、进程控制块三部分组成。
多个不同进程可以包含相同的程序:一个程序在不同数据集里就构成不同的进程,能得到不同的结果,但是在执行过程中,程序不能发生变化。
- 进程的状态:
就绪状态:进程已经获得除处理器外所需资源,等待分配处理器资源,只要分配了处理器进程就可执行;
运行状态:进程占用处理器资源、处于此状态的进程数目小于或者等于处理器的数目;阻塞状态:由于进程等待某种条件,在条件满足之前无法继续执行。
- Miltiprocessing(多进程):
Multiprocessing是Python提供的非常好用的多进程包,用户只需要简单的定义一个函数,
Python就会自动地完成其他的所有事情。它支持子进程、进程间通信、数据共享、不同形式的同步,提供了包括Process、Queue、Pipe、Lock在内的各种组件。合理运用这些组件,可以轻松地完成单进程到并发执行的转换。
创建进程Process模块:
class multiprocessing.Process(group=None,target=None,name=None,args=(),kwargs={})
其中,group为None,它的存在是为了兼容threading.Thread,target表示调用对象,name为别名,args表示调用对象的位置参数元组,kwargs表示调用对象的字典。
例如:创建函数并将其作为多个进程
import multiprocessing
import time
def worker_1(interval):
print("worker_1")
time.sleep(interval)
print("end worker_1")
def worker_2(interval):
print("worker_2")
time.sleep(interval)
print("end worker_2")
def worker_3(interval):
print("worker_3")
time.sleep(interval)
print("end worker_3")
if __name__=='__main__':
p1=multiprocessing.Process(target=worker_1,args=(2,))
p2=multiprocessing.Process(target=worker_2,args=(3,))
p3=multiprocessing.Process(target=worker_3,args=(4,))
p1.start()
p2.start()
p3.start()
print("The number of CPU is:"+str(multiprocessing.cpu_count()))
for p in multiprocessing.active_children():
print("child p.name:"+p.name+"\tp.id"+str(p.pid))
#运行结果:
The number of CPU is:4
child p.name:Process-2 p.id9804
child p.name:Process-1 p.id9172
child p.name:Process-3 p.id6608
注释#:上述代码中使用multiprocessing.cpu_count()函数查看当前计算机的CPU数量,并通过语句multiprocessing.active_children()和for()循环的结合使用,能够清楚地查看当前活动的进程数。运行结果以worker_1、2、3的顺序输出,说明这三个进程间是并发执行的,所以每次开始时的输出顺序可能有所不同。
- 守护进程Daemon
- 进程间通信技术Queue通信和Pipe管道(用到之时再补充,不太懂--Python程序设计实用教程--杨连贺)
python之多线程与多进程的更多相关文章
- Python之多线程和多进程
一.多线程 1.顺序执行单个线程,注意要顺序执行的话,需要用join. #coding=utf-8 from threading import Thread import time def my_co ...
- Python的多线程和多进程
(1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高.单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进 ...
- Python【多线程与多进程】
import time,threading print("=======串行方式.并行两种方式调用run()函数=======")def run(): print('哈哈哈') # ...
- python的多线程、多进程代码示例
python多进程和多线程的区别:python的多线程不是真正意义上的多线程,由于python编译器的问题,导致python的多线程存在一个PIL锁,使得python的多线程的CPU利用率比预期的要低 ...
- selenium +python之多线程与多进程应用于自动化测试
多线程与多进程与自动化测试用例结合起来执行,从而节省测试用例的总体运行时间. 多线程执行测试测试用例 以百度搜索为例,通过不同的浏览器来启动不同的线程. from selenium import we ...
- Python之多线程与多进程(二)
多进程 上一章:Python多线程与多进程(一) 由于GIL的存在,Python的多线程并没有实现真正的并行.因此,一些问题使用threading模块并不能解决 不过Python为并行提供了一个替代方 ...
- Python之多线程与多进程(一)
多线程 多线程是程序在同样的上下文中同时运行多条线程的能力.这些线程共享同一个进程的资源,可以在并发模式(单核处理器)或并行模式(多核处理器)下执行多个任务 多线程有以下几个优点: 持续响应:在单线程 ...
- python的多线程和多进程(一)
在进入主题之前,我们先学习一下并发和并行的概念: --并发:在操作系统中,并发是指一个时间段中有几个程序都处于启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但任一时刻点上只有一个程序在处理 ...
- Python中多线程与多进程的恩恩怨怨
概念: 并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运 ...
- python的多线程、多进程、协程用代码详解
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:刘早起早起 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...
随机推荐
- 更换过Ubuntu之后经常性卡死,原因有待细究
如题: 卡死时间: 2019-5-22-14:45 再次卡死,这次绝对不是看视频的原因了,具体什么原因还是不知道,不过我觉得就是显卡的问题,和搜索出来的问题差不多,安装了一些东西,看看行不行吧 sud ...
- IDEA Maven Hadoop调试hdfs程序
IDEA 远程调试 Hadoop 两大特色:一是采用maven的pom配置:二是直接连接hdfs:9000端口,无须另外在服务端配置参数. 其实内容包含了两种方式:本地与远程调试.这里仅仅只是使用远程 ...
- Query on a tree again! SPOJ - QTREE3
https://vjudge.net/problem/SPOJ-QTREE3 https://www.luogu.org/problemnew/show/P4116 一个log(LCT)比两个log( ...
- 基于python的request库,模拟登录csdn博客
以前爬虫用urllib2来实现,也用过scrapy的爬虫框架,这次试试requests,刚开始用,用起来确实比urllib2好,封装的更好一些,使用起来简单方便很多. 安装requests库 ...
- 【转载】(0, eval)(‘this’)
var window = this || (0, eval)('this') 在avalon源码中有这么一行代码,var window = this很容易理解 这里复习一下Global Object: ...
- 降低winnt Apache服务的权限,让你的虚拟主机更安全
winnt 安装 Apache 后,在后台的服务默认是以system权限运行的(system是winnt的最高权限),这给服务器带来很大的安全隐患,最近我遇到的就是php的W8C 文件管理既然可以随意 ...
- input标签属性
很多时候,我们都用到了很多标签实现输入功能,所以在这里梳理一下. 1.建立一个文本框 <input type="text" name="userName" ...
- ES6—带默认值的函数参数及其作用域
在学习ES6函数一章时,发现了一个有意思的现象,原文描述如下: 这段话主要state了3个事实: ①函数参数有默认值时,会在声明初始化阶段形成一个单独的作用域 ②这个作用域在初始化结束后消失 ③没默认 ...
- JavaScript创建对象的七种方法
一. 工厂模式 创建: function createPerson(name,behavior){ var p=new Object(); p.name=name; p.behavior=behavi ...
- Selenium2(WebDriver)开发环境搭建(java版)
一.开发环境 1.JDK 2.Eclipse 3.Firefox 28.0 4.selenium-java-2.44.0.zip 解压后: 5.selenium-server-standalone-2 ...