python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势。

针对计算密集型场景需要使用多进程,python的multiprocessing与threading模块非常相似,支持用进程池的方式批量创建子进程。

•创建单个Process进程(使用func)

只需要实例化Process类,传递函数给target参数,这点和threading模块非常的类似,args为函数的参数

import os

from multiprocessing import Process

# 子进程要执行的代码

def task(name):

print('run child process %s (%s)...' % (name, os.getpid()))

if __name__ == '__main__':

print('parent process %s.' % os.getpid())

p = Process(target=task, args=('test',))

p.start()

p.join()

print('process end.')

•创建单个Process进程(使用class)

继承Process类,重写run方法创建进程,这点和threading模块基本一样

import multiprocessing

import os

from multiprocessing import current_process

class Worker(multiprocessing.Process):

def run(self):

name = current_process().name # 获取当前进程的名称

print('run child process (%s)' % (name, os.getpid()))

print('In %s' % self.name)

return

if __name__ == '__main__':

print('parent process %s.' % os.getpid())

p = Worker()

p.start()

p.join()

print('process end.')

* 停止进程

terminate()结束子进程,但是会导致子进程的资源无法释放掉,是不推荐的做法,因为结束的时候不清楚子线程的运行状况,有很大可能性导致子线程在不恰当的时刻被结束。

import multiprocessing

import time

def worker():

print('starting worker')

time.sleep(0.1)

print('finished worker')

if __name__ == '__main__':

p = multiprocessing.Process(target=worker)

print('执行前:', p.is_alive())

p.start()

print('执行中:', p.is_alive())

p.terminate() # 发送停止号

print('停止:', p.is_alive())

p.join()

print('等待完成:', p.is_alive())

•直接创建多个Process进程

import multiprocessing

def worker(num):

print(f'Worker:%s %s', num)

return

if __name__ == '__main__':

jobs = []

for i in range(5):

p = multiprocessing.Process(target=worker, args=(i,))

jobs.append(p)

p.start()

•使用进程池创建多个进程

在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。

Pool可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。

import os

import random

import time

from multiprocessing import Pool

from time import ctime

def task(name):

print('start task %s (%s)...' % (name, os.getpid()))

start = time.time()

time.sleep(random.random() * 3)

print('end task %s runs %0.2f seconds.' % (name, (time.time() - start)))

if __name__ == '__main__':

print('parent process %s.' % os.getpid())

p = Pool() # 初始化进程池

for i in range(5):

p.apply_async(task, args=(i,)) # 追加任务 apply_async 是异步非阻塞的,就是不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。

p.close()

p.join() # 等待所有结果执行完毕,会等待所有子进程执行完毕,调用join()之前必须先调用close()

print(f'all done at: {ctime()}')

如果关心每个进程的执行结果,可以使用返回结果的get方法获取,代码如下

import os

import random

import time

from multiprocessing import Pool, current_process

from time import ctime

def task(name):

print('start task %s (%s)...' % (name, os.getpid()))

start = time.time()

time.sleep(random.random() * 3)

print('end task %s runs %0.2f seconds.' % (name, (time.time() - start)))

return current_process().name + 'done'

if __name__ == '__main__':

print('parent process %s.' % os.getpid())

result = []

p = Pool() # 初始化进程池

for i in range(5):

result.append(p.apply_async(task, args=(i,))) # 追加任务 apply_async 是异步非阻塞的,就是不用等待当前进程执行完毕,随时根据系统调度来进行进程切换。

p.close()

p.join() # 等待所有结果执行完毕

for res in result:

print(res.get()) # get()函数得出每个返回结果的值

print(f'all done at: {ctime()}')

总结

以上所述是小编给大家介绍的python使用多进程的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

本文标题: python使用多进程的实例详解

本文地址: http://www.cppcns.com/jiaoben/python/240015.html

python多进程应用场景_python使用多进程的实例详解相关推荐

  1. python中字符串乘法_python leetcode 字符串相乘实例详解

    给定两个以字符串形式表示的非负整数 num1 和  num2 ,返回  num1 和  num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...

  2. python 正则式替换_python 正则表达式参数替换实例详解

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python ...

  3. python的scatter函数_python scatter函数用法实例详解

    这篇文章主要介绍了python scatter函数用法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 函数功能:寻找变量之间的关系. 调用签 ...

  4. python url解码_对python中url参数编码与解码的实例详解

    一.简介 在python中url,对于中文等非ascii码字符,需要进行参数的编码与解码. 二.关键代码 1.url编码 对字符串编码用urllib.parse包下的quote(string, saf ...

  5. python中label有什么用_对Python中TKinter模块中的Label组件实例详解

    Python2.7.4 OS-W7x86 1. 简介 Label用于在指定的窗口中显示文本和图像.最终呈现出的Label是由背景和前景叠加构成的内容. Label组件定义函数:Label(master ...

  6. python的turtle怎么设置rgb颜色_Python : turtle色彩控制实例详解

    ? 1 turtle.pencolor(* args ) 返回或设置pencolor. 允许四种输入格式: ? 1 pencolor() 将当前的pencolor返回为颜色规范字符串或元组(参见示例) ...

  7. python strptime函数转时间数组_python time.strptime格式化实例详解

    在python的时间使用时,我们无非就是输出字符串的形式,又或者是其他的形式跟字符串之间的来回转换.时间数组对于我们获取具体的年或是天数,都是常用的首段.本篇需要讲到的time.strptime函数, ...

  8. python画tan_Python入门之三角函数tan()函数实例详解

    描述 tan() 返回x弧度的正弦值. 语法 以下是 tan() 方法的语法: import math math.tan(x) 注意:tan()是不能直接访问的,需要导入 math 模块,然后通过 m ...

  9. python实现非对称加密算法_Python3非对称加密算法RSA实例详解

    本文实例讲述了Python3非对称加密算法RSA.分享给大家供大家参考,具体如下: python3 可以使用 Crypto.PublicKey.RSA 和 rsa 生成公钥.私钥. 其中 python ...

最新文章

  1. 树莓派搭建 DNS 服务器 | 树莓派小无相系列
  2. UVA 12266 Stock prices --优先队列
  3. python3 正则表达式点星问号(.*?)能不能匹配换行符?不能的话应该怎么写
  4. oracle分页数据,在Oracle中得到分页数据
  5. 关于物联网通信协议(通讯协议)
  6. 视频课程-1小时上手 Spring Boot 及 达梦数据库 做数据展示后端
  7. 判断new出来的对象里面值为null
  8. 谁为“上班玩耍”买单
  9. linux虚拟化技术 教程,Linux上实现虚拟化技术的优势
  10. Atititcmd cli环境变量的调用设置与使用
  11. php 微信支付h5 referer,微信H5支付
  12. 服务器虚拟机系统镜像安装win7系统,VMware虚拟机安装ghost win7系统_VM虚拟机怎么安装w7 iso映像文件?...
  13. Fibonacci费氏数列
  14. excel表格横向纵向变换_Excel新手最容易给自己挖的几个坑,手把手教你完美避雷!...
  15. [学习笔记-FPGA]Vivado出现信号差分问题
  16. 计算机网络提供给用户的常见服务有文件服务,【填空题】计算机网络提供给用户的常见服务主要有文件服务、消息传递服务、__________服务和应用服务。...
  17. 什么是联想能力?如何提高联想能力?
  18. 菜鸟学Django(持续更新)
  19. 测试用例----测试大纲法
  20. Unity 之 查看Android手机实时日志

热门文章

  1. 【汇总】ElementUI中高频次使用代码片段
  2. Linux的僵尸进程
  3. linux 使用sendmail发送邮件
  4. 【Java面试题】54 去掉一个Vector集合中重复的元素
  5. 数学工具WZgrapher
  6. slider(滑动条)控件模版,样式--用图片定义控件模版
  7. grep 正则表达式及选项以及注意
  8. ZendFramework的介绍、安装和实例运行
  9. 何时使用margin和padding?
  10. 一个常用的正则表达验证类