进程与程序

程序:例如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 KeyEvent事件机制

    package im.weiyuan.com.viewutils; import android.content.Intent; import android.os.PersistableBundle ...

  2. 从 Tapable 中得到的启发

    Tapable Why Tapable 前端开发中 Webpack 本质上是基于事件流的运行机制,它的工作流程是将特定的任务分发到指定的事件钩子中去完成.而实现这一切的核心就是 tapable,Web ...

  3. WAF产品记录

    WAF产品化 2011-1-13 目标:稳定的版本 和 标准的手册   1.硬件差异问题,争取了OEM提供硬件样机. 2.OEM功能本来在我们手里,为了更好产品化,配合移交工作. 3.我们做好 产品生 ...

  4. 哈希传递攻击利用(Pass The Hash)

    最近又复习了一下内网的相关知识,把以前的整理了一下发出来做个记录. 0x01 哈希传递攻击概念 有一点内网渗透经验的都应该听说过哈希传递攻击,通过找到相应账户相关的密码散列值(LM Hash,NTLM ...

  5. 洛谷 P1692 【部落卫队】

    啊这道题其实暴力就行了,算是一道搜索入门题吧. 搜索变量就应该是当前到哪一位了,然后进行枚举,当前的一位加或者不加,然后知道搜完为止. 判断当前一位可不可以加的时候本来想用vector的,但是没调出来 ...

  6. 二.4vue展示用户数据及用户组操作以及给用户组添加额外字段

    一.用户列表 1.新建(1)views/users/index.vue: <template> <div class="user-list-container"& ...

  7. python_Linux系统的常用命令(三)

    用户权限常用命令 1.用户和权限 r--读--4, w--写--2, x--执行--1 chmod 可以修改用户/组对文件/目录的权限 格式:chmod +/-rwx 文件名/目录名 su -用户:切 ...

  8. 每日一题 - 剑指 Offer 45. 把数组排成最小的数

    题目信息 时间: 2019-07-01 题目链接:Leetcode tag: 快速排序 难易程度:中等 题目描述: 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最 ...

  9. Hadoop2.7.7 centos7 完全分布式 配置与问题随记

    Hadoop2.7.7 centos7 完全分布式 配置与问题随记 这里是当初在三个ECS节点上搭建hadoop+zookeeper+hbase+solr的主要步骤,文章内容未经过润色,请参考的同学搭 ...

  10. 「疫期集训day1」无言

    正式集训第一天,感觉没啥特别大的感受,无非是奥赛时间延长了,效率提高了,身外事少了 当然不止这些 感受1:有些曾经被恶的题现在仍然在恶心,例如昨天的farmcraft,今天的整数划分(和着多边形一块调 ...