进程与程序

程序:例如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. Python3-设计模式-迭代器模式

    Python3中的迭代器 迭代器模式主要是访问集合元素的一中方式,迭代器不会把整个集合对象加载到内存,而是按照顺序将集合中的元素一个一个的进行迭代,这样每次迭代的时候只取少量的元素,比较省内存 注: ...

  2. 一起玩转微服务(13)——AOP

    一.什么是AOP编程 AOP: Aspect Oriented Programming 面向切面编程. 面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP), ...

  3. Docker入门(1):概述

    1.摘要 在这篇文章中,我将介绍一下为什么需要虚拟化的环境. 然后我将介绍耳熟能详的虚拟化技术:虚拟机,并大致的介绍一下虚拟机的原理,希望能够让你知道虚拟机的优劣. 在之后,针对虚拟机存在的问题,引出 ...

  4. JDK8--02:为什么要使用lambda

    lambda是一个匿名函数,我们可以把lambda理解为一个可以传递的代码(将代码像数据一样传递),可以写出更简洁更灵活的代码.首先看一下原来的匿名内部类实现方式(以比较器为例) //原来的匿名内部类 ...

  5. 【Spring】内嵌Tomcat&去Xml&调试Mvc

    菜瓜:今天听到个名词“父子容器”,百度了一下,感觉概念有点空洞,这是什么核武器? 水稻:你说的是SpringMvc和Spring吧,其实只是一个概念而已,用来将两个容器做隔离,起到解耦的作用,其中子容 ...

  6. Kubernetes 两步验证 - 使用 Serverless 实现动态准入控制

    作者:CODING - 王炜 1. 背景 如果对 Kubernetes 集群安全特别关注,那么我们可能想要实现这些需求: 如何实现 Kubernetes 集群的两步验证,除了集群凭据,还需要提供一次性 ...

  7. Python-使用百度文字识别API实现的文字识别工具

    import requests import base64 import keyboard import mouse import time import os from PIL import Ima ...

  8. Write a program to copy its input to its output, replacing each tab by \t, each backspace by \b, and each backslash by \\. This makes tabs and backspa

    #include <stdio.h> #define DBS '\\' void main() { int c; while((c=getchar())!=EOF) { if(c=='\t ...

  9. Android 用视频做页面背景

    不知道怎么开头,直接代码. xml:RelativeLayout布局,MyVideoView放在第一位,其他的放到之下就可以. <MyVideoView android:id="@+i ...

  10. 内嵌iframe页面在IOS下会受内部元素影响自动撑开的问题

    IOS下的webview页面,内嵌iframe元素,将其样式指定为宽高100%: .iframe { width: %; height: %; } 在安卓下运行均无问题,但是在IOS下会出现异常. 具 ...