热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python学习笔记fork,multiprocessing

Python一直是一门对初学者非常友好的语言,在数据分析、Web开发、网络安全、网络爬虫等方面应用广泛。近年来,人工智能的兴起使得Python更加火爆了。我们在处理大量数据或者需要

Python一直是一门对初学者非常友好的语言,在数据分析、Web 开发、网络安全、网络爬虫等方面应用广泛。近年来,人工智能的兴起使得 Python 更加火爆了。

我们在处理大量数据或者需要快速爬取多种网络资源的时候,我们无法避免使用到进程。Cpython 解释器中多线程涉及到 GIL 问题,我们这里暂不做考虑。

Python 实现多进程的方式有多种,我们下面一一来学习一下吧。

fork

Linux/Unix系统提供了一个非常特殊的函数fork().该函数在调用之后,调用它的进程会被复制一份,包括当前的RAM和接下来要执行的代码。
关于fork的具体内容可以阅读更多的文章:
http://blog.csdn.net/jason314…
http://blog.csdn.net/cywosp/a…

调用的fork()函数,它在主进程中返回的是子进程的pid;它在子进程中反馈的是0.
那么,我们就可以根据fork()函数返回的值来判断是在主进程中还是在子进程中了。
在Python中,为我们提供了os.fork()

import os
print "Process (%s) is running" % os.getpid()
i = 100
pid = os.fork()
if pid == 0:
print "Son process (%s) is running" % os.getpid()
else:
print "Main process (%s) is running" % os.getpid()

上面的代码用到了几个函数,罗列如下:

  • os.fork(),创建进程,在主进程中返回子进程的id,在子进程中返回0.
  • os.getpid() 获取到当前进程的id。
  • os.getppid() 获取当前进程父进程的id。

但是唯一遗憾的是,fork()函数只能在linuxunix系统中使用,不能在windows系统中使用。

multiprocessing

Python提供了跨平台的多进程支持,multiprocessing. multiprocessing模块提供了一个Process类代表一个进程。我们可以用Process创建一个进程。

from multiprocessing import Process
import time
def son_process(name):
time.sleep(2)
print "Process %s is running" % name
if __name__ == '__main__':
son_process = Process(target=son_process, args=('Son',))
print "Son process is started"
son_process.start()
son_process.join()
print "Son process is ended - Printed by Main Process"

上面主要用到了

  • Process(target, attrs) 构造一个进程
  • process.start() 进程开始
  • process.join() 进程同步,Main进程序等待子程序完成后在执行后代码。

需要注意的是,在windows下,如果子进程序不是在__main__中创建的,那么就会出错。因为windows在创建子进程的时候,会将创建它的py文件import进去。import进去机会执行,那么就会不断地创建子进程,所以会出错。
因此在windows下,需要将其包含在__main__中。

Pool

上面的提到的Process主要用于创建一个进程,如何创建多个呢?Python在multiprocessing包里为我们提供了Pool类。
我们可以使用Pool.apply_async(func, args)函数来创建子进程。
代码:

from multiprocessing import Pool
import time
def son_process(name):
time.sleep(5)
print "Process %s is running\n" % name
pool = Pool(4)
print "Son process is started"
for x in range(0, 10):
pool.apply_async(son_process, args=('son_%d'%x,))
pool.close()
print "Mark"
pool.join()
print "Son process is ended - Printed by Main Process"

  • Pool(4)
  • join()

Wait for the worker processes to exit. One must call close() or terminate() before using join().即主进程会在.join()处等待worker进程们结束后再执行。

apply() 和 apply_async()

apply()apply_async()的区别就是前者是阻塞式的,后者是非阻塞式的。
阻塞式意思就是需要等待子进程完成后才能执行主线程后续的内容。
非阻塞意思就是无需等待子进程,两者是同步进行的。

map() 和 map_async()

跟高阶函数map()一致,Poolmap()函数是将一个可迭代对象的每一个元素作用域func
map也分阻塞和非阻塞。

imap() 和 imap_unordered()

imap 与 map的区别是,map是当所有的进程都已经执行完了,并将结果返回了,那么才返回map()函数的一个list结果。
imap()则是立即返回一个iterable可迭代对象。其迭代随着进行返回的结果而逐步迭代。

imap()和 imap_unordered()的区别

imap_unordered()不保证返回的结果顺序与进程添加的顺序一致。

怎么取得进程的结果?

阻塞式函数:
Pool.apply()直接返回结果
Pool.map() 直接返回一个list
非阻塞式函数
Pool.apply_async()和Pool.map_async() 返回一个AsyncResult对象。
AsyncResult对象具有:get()函数可以获取结果。
imap() imap_unordered()则是返回可迭代函数。

一个有用的函数 multiprocessing.cpu_count()

multiprocess.cpu_count()可以返回本计算机cpu的数量。
我们在新建一个进程池的时候,如果不填写任何参数,那么进程池的容量默认就是cpu的数量。


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
author-avatar
wesley_zx
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有