进程与程序

程序:例如xxx.py这是程序,是一个静态的

进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。

multiprocessing模块

multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情

from multiprocessing import Process
import time
import os def dancing():
print('开始跳舞,进程号:%d' % os.getpid())
for i in range(5):
print('正在跳舞:。。。。%d' % i)
time.sleep(0.5)
print('结束跳舞') def singing():
print('开始唱歌,进程号:%d' % os.getpid())
for i in range(5):
print('正在唱歌:。。。。%d' % i)
time.sleep(0.5)
print('结束唱歌') if __name__ == '__main__':
# 创建对象
p1 = Process(target=dancing)
p2 = Process(target=singing)
# 调用进程
p1.start()
p2.start()

windows中可能多进程无效

多进程在window10下的部分IDE中运行无效,如在sublime中运行结果还是并行的

而在安装python后自带的IDLE中运行,也是无效的

而只有在cmd终端运行时并行才有效果

给进程传递参数

from multiprocessing import Process
import time
import os def dancing(name, num, **kwargs):
print('开始跳舞,进程号:%d, name=%s, num=%d, age=%d' % (os.getpid(), name, num, kwargs['age']))
for i in range(num):
print('%s正在跳舞:。。。。%d' % (name, i))
time.sleep(0.5)
print('结束跳舞') def singing(name, num, **kwargs):
print('开始唱歌,进程号:%d, name=%s, num=%d, age=%d' % (os.getpid(), name, num, kwargs['age']))
for i in range(num):
print('%s正在唱歌:。。。。%d' % (name, i))
time.sleep(0.5)
print('结束唱歌') if __name__ == '__main__':
# 创建对象
p1 = Process(target=dancing, args=('xiaoming', 5), kwargs={'age': 10})
p2 = Process(target=singing, args=('xiaohong', 10), kwargs={'age': 20})
# 调用进程
p1.start()
p2.start()

运行结果

进程间通信

使用multiprocessing自带的队列:Queue

from multiprocessing import Process, Queue
import time def put(queue):
for i in [11, 22, 33, 44, 55]:
print('put: %d' % i)
queue.put(i)
time.sleep(0.5) def read(queue):
while not queue.empty():
print('read: %d' % queue.get())
time.sleep(0.5) if __name__ == '__main__':
# 创建Queue对象
queue = Queue()
# 创建对象
p1 = Process(target=put, args=(queue, ))
p2 = Process(target=read, args=(queue, ))
# 开始进程p1
p1.start()
# 等待p1运行完
p1.join()
print('queue是否满了:', queue.full(), ', 是否空了:', queue.empty())
print('queue的大小为:%d' % queue.qsize())
# 开始进程p2
p2.start()
# 等待p2运行完
p2.join()
print('queue是否满了:', queue.full(), ', 是否空了:', queue.empty())
print('queue的大小为:%d' % queue.qsize())

运行结果为:

进程池

当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。

初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务,

from multiprocessing import Pool
import time
import os
import random def worker(msg):
start_time = time.time()
print('----------%s开始执行,进程号%d' % (msg, os.getpid()))
time.sleep(random.random())
end_time = time.time()
print('----------%s执行结束, 耗时%0.2f' % (msg, (end_time - start_time)))
# 异常测试
print('捕获下面的print异常前')
try:
print(1 + 'end')
except Exception as e:
print('捕获到异常')
print('不捕获下面的print异常')
print(1 + 'end')
print('不捕获异常后') def main():
# 定义进程池,最大进程数为3
pool = Pool(3)
for i in range(1, 8):
# 每次循环将会用空闲出来的子进程去调用目标
pool.apply_async(worker, (i, ))
pool.close()
pool.join()
# worker(0) if __name__ == '__main__':
main()

运行结果为:

可以看到先立马将三个进程放入进程池中并开始执行,等到其中的某个进程运行结束后,再将新的进程放入进程池中

在异常测试中发现,进程池中的方法,如果出现了异常,在运行时并不会直接报错,而只是是中断该进程,所以这里需要注意要手动将可能的异常进行捕获

进程池中使用Queue

如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否则会得到一条如下的错误信息:

RuntimeError: Queue objects should only be shared between processes through inheritance.

进程与线程对比

定义的不同

  1. 进程是系统进行资源分配和调度的一个独立单位.
  2. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

其他区别

  1. 一个程序至少有一个进程,一个进程至少有一个线程.
  2. 线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。
  3. 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
  4. 线程不能够独立执行,必须依存在进程中
  5. 线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。

python-多任务编程02-进程(processing)的更多相关文章

  1. python并发编程02 /多进程、进程的创建、进程PID、join方法、进程对象属性、守护进程

    python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 目录 python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 ...

  2. Python 多进程编程之 进程间的通信(在Pool中Queue)

    Python 多进程编程之 进程间的通信(在Pool中Queue) 1,在进程池中进程间的通信,原理与普通进程之间一样,只是引用的方法不同,python对进程池通信有专用的方法 在Manager()中 ...

  3. Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...

  4. python并发编程之进程、线程、协程的调度原理(六)

    进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...

  5. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  6. 15.python并发编程(线程--进程--协程)

    一.进程:1.定义:进程最小的资源单位,本质就是一个程序在一个数据集上的一次动态执行(运行)的过程2.组成:进程一般由程序,数据集,进程控制三部分组成:(1)程序:用来描述进程要完成哪些功能以及如何完 ...

  7. Python网络编程(进程通信、信号、线程锁、多线程)

    什么是进程通讯的信号? 用过Windows的我们都知道,当我们无法正常结束一个程序时, 可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢? 同样的功能在Linux上是通过生成信号和捕获信号来实 ...

  8. python网络编程(进程与多线程)

    multiprocessing模块 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程. multiproce ...

  9. Python并发编程之进程

    一.理论概念 1.定义 进程(Process 也可以称为重量级进程)是程序的一次执行.在每个进程中都有自己的地址空间.内存.数据栈以及记录运行的辅助数据,它是系统进行资源分配和调度的一个独立单位. 2 ...

  10. python并发编程之进程池,线程池,协程

    需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去自己加 ...

随机推荐

  1. android面试详解

    前台就是和用户交互的进程 可见进程例如一个activity被一个透明的对话框覆盖,该activity就是可见进程 服务:service进程 后台一个activity按了home按键就是从前台退回到后台 ...

  2. vue全家桶(2.5)

    3.8.动态路由匹配和路由组件传参 3.8.1.动态路由匹配 动态路由意味着不固定,具有某种模式,我们希望通过某种匹配方式,把这种不固定的路由形势映射到同一个组件,例如:一个User组件,不同的ID表 ...

  3. 通过网络经过路由器映射电脑ip到外网路由器

    一.内网自己电脑做服务器 自己电脑ip为192.168.0.104 首先先把自己路由器ip192.168.1.82映射到外网路由器,其中外网路由器ip为59.40.0.196 让后本机ip地址192. ...

  4. Jquery的一些方法

    $.trim(str);说明:去掉字符串首尾空格.

  5. 一.8.django权限管理/drf权限管理

    1.什么是权限管理: .权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源 .权限管理好比如钥匙,有了钥匙就能把门打开,但是权限设置是有级别之分的,假如这个系 ...

  6. C++ MFC 文件操作(新建,删除,剪切,复制,读数据,写数据,重命名)

    源文件:http://pan.baidu.com/s/1ve0hV 这是运行mfc缺失的dll动态链接库:http://pan.baidu.com/s/17pGlT 哈哈,我也是初接触C++,基础的什 ...

  7. '%' For instance '%d'

    with each % indicating where one of the other (second, third, ...) arguments is to be substituted, a ...

  8. CentOS7下安装Docker《超详细新手教程》

    1.使用 root 权限登录 Centos.确保 yum 包更新到最新. sudo yum update 2.卸载旧版本(如果安装过旧版本的话) sudo yum remove docker dock ...

  9. C#读取Excel转为DataTable

    需要的Dll: NPOI.OOXML.dll    https://files.cnblogs.com/files/CityOfThousandFires/NPOI.dl.rar /// <su ...

  10. 使用virtualBox 创建虚拟机

    第一次使用感觉并没有VMware好用,尤其是鼠标在虚拟机和宿主机之间切换的时候很烦,需要按键盘右边ctrl虽然有提示right ctrl但是第一次使用硬是折腾了好半天.感觉不记录一下对不起这个下午. ...