Python多进程的使用详情

目录
  • 一、进程的创建
    • 1、一些常用方法介绍
  • 二、进程池的使用
  • 三、多进程和多线程的优缺点对比

一、进程的创建

Pythonmultiprocessing模块提供了Process类,该类可用来在各平台下创建新进程。其构造函数是:

__init__(self, group=None, target=None, name=None, args=(), kwargs={})

其中,各个参数的含义如下:

  • group: 该参数未实现,不需要传参
  • target:为新建进程指定执行任务,也就是指定一个函数
  • args:以元组的方式,为target指定的方法传递参数,如果传入的是元组中有多个参数的话则传入方式是(arg1,arg2,....argn,)
  • kwargs:以字典的方法,为target指定的方法传递参数。
  • name: 为新建进程设置名称

1、一些常用方法介绍

start() 方法用于启动进程
run() 方法用于运行所要执行的任务
is_alive() 方法用于判断当前进程是否还活着
getPid() 方法用于获取进程的ID号。

直接创建Process类的实例对象,由此就可以创建一个新的进程;

这个就类似于直接创建实例化线程Thread类

from multiprocessing import Process
import os
# 定义要调用的方法
def async_fun(name, add):
    for arc in add:
        print(name + str(os.getpid()) + " " + arc)

if __name__ == '__main__':
    my_tuple = ("码农飞哥", "今天是宅家的一天", "30岁了还没对象焦虑呀")

    # 创建进程
    process = Process(target=async_fun, args=("子进程", my_tuple))
    # 启动子进程
    process.start()
    # 启动主进程
    async_fun("主进程", my_tuple)

运行结果是:

主进程11610 码农飞哥
主进程11610 今天是宅家的一天
主进程11610 30岁了还没对象焦虑呀
子进程11612 码农飞哥
子进程11612 今天是宅家的一天
子进程11612 30岁了还没对象焦虑呀

这里需要注意的一点是,必须要将代码放在if __name__ == '__main__': 代码块中。通过os.getpid()方法来获取进程号。

通过继承Process类的子类,创建实例对象,也可以创建新的进程。

第二种方式就是通过继承Process类的子类,创建实例对象,也可以创建新的进程,不过这种方式需要重写父类的run()方法。这种方法就类似于直接继承Thread类创建线程。

import multiprocessing
import os

# 定义要调用的方法
def async_fun(name, add):
    for arc in add:
        print(name + str(os.getpid()) + " " + arc)

class MyProcess(multiprocessing.Process):
    def __init__(self, name, add):
        multiprocessing.Process.__init__(self)
        self.add = add
        self.name = name
        # 重写run()方法

    def run(self):
        async_fun(self.name, self.add)

if __name__ == '__main__':
    my_tuple = ("码农飞哥", "今天是宅家的一天", "宅家也不能虚度")
    myprocess = MyProcess("子进程", my_tuple)
    myprocess.start()
    # 主进程
    async_fun("主进程", my_tuple)

运行结果同上:

主进程11610 码农飞哥
主进程11610 今天是宅家的一天
主进程11610 30岁了还没对象焦虑呀
子进程11612 码农飞哥
子进程11612 今天是宅家的一天
子进程11612 30岁了还没对象焦虑呀

这里还是推荐使用第一种方法创建进程,因为这种方式创建进程比较简洁

二、进程池的使用

由于创建进程对系统的开销比较大。所以,所以在实际开发中一般都会使用进程池来创建进程。进程池的使用与线程池的使用也是有神似的地方。同样的在multiprocessing模块中提供了Pool函数来创建进程池。

import os
from multiprocessing import Pool
import time

# 定义要调用的方法
def async_fun(add):
    time.sleep(1)
    print("进程号:" + str(os.getpid()) + " " + add)

if __name__ == '__main__':
    add = "码农飞哥,今天是宅家的一天,30岁了还没对象焦虑呀"
    # 创建包含4个进程的进程池
    pool = Pool(processes=4)
    # 提交action
    pool.apply_async(func=async_fun, args=(add,))
    pool.apply_async(func=async_fun, args=("加油加油",))
    pool.close()
    pool.join()

运行结果是:

进程号:11658 码农飞哥,今天是宅家的一天,30岁了还没对象焦虑呀
进程号:11659 加油加油

同样的进程池也可以通过with语句来创建

from multiprocessing import Pool
import os
import time

def async_add(max):
    time.sleep(1)
    print("进程号:" + str(os.getpid()) + "最大值是" + str(max))

if __name__ == '__main__':
    with Pool(processes=4) as pool:
        # 使用线程池执行max计算
        results = pool.map(async_add, (20, 30, 40, 50))

运行结果是:

进程号:11726最大值是20
进程号:11725最大值是30
进程号:11727最大值是40
进程号:11728最大值是50

三、多进程和多线程的优缺点对比

多进程的优点就是稳定性好,一个子进程崩溃了,不会影响主进程以及其余子进程,各个子进程各用一套独立的内存空间。多线程的优点就是效率高,适用于批处理等功能。
多进程的缺点就是创建进程的代价非常大,因为操作系统要给每个进程分配固定的资源,并且操作系统对进程的总数会有一定的限制,若进程过多,操作系统调度都会存在问题,会造成假死状况。

总结:

到此这篇关于Python多进程的使用详情的文章就介绍到这了,更多相关Python多进程的使用,内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python多进程基础详解

    目录 进程 开启一个进程 JOIN方法 进程之间空间隔离 进程的常用方法 current_process 查看pid(进程id) os.getpid() 查看进程id 进程其他方法和属性 守护进程 互斥锁 进程间通信(IPC机制) JoinableQueue 来实现生产消费者 总结 进程 什么是进程 进程指的是一个程序的运行过程,或者说一个正在执行的程序 所以说进程一种虚拟的概念,该虚拟概念起源操作系统 一个CPU 同一时刻只能执行一件事 开启一个进程 from multiprocessing

  • Python 多进程原理及实现

    1 进程的基本概念 什么是进程? ​ 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要使用的资源:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志. 进程的生命周期:创建(New).就绪(Runnable).运行(Running).阻塞(Block).销毁(Destroy) 进程的状态(分类)

  • Python多线程与多进程相关知识总结

    一.什么是进程 进程是执行中的程序,是资源分配的最小单位:操作系统以进程为单位分配存储空间,进程拥有独立地址空间.内存.数据栈等 操作系统管理所有进程的执行,分配资源 可以通过fork或 spawn的方式派生新进程,新进程也有自己独立的内存空间 进程间通信方式(IPC,Inter-Process Communication)共享信息,实现数据共享,包括管道.信号.套接字.共享内存区等. 二.什么是线程 线程是CPU调度的的最小单位 一个进程可以有多个线程 同进程下执行,并共享相同的上下文 线程间

  • python 实现多进程日志轮转ConcurrentLogHandler

    记录日志是我们程序中必不可少的一个功能,但是日志文件如果没有合理的管理,时间长了几百兆的日志文件就很难分析了(都不想打开看),但是又不可能经常手动去管理它 日志轮转:根据时间或者文件大小控制日志的文件个数,不用我们手动管理 python中logging模块内置的有几个支持日志轮转的handler 常用的有TimedRotatingFileHandler根据时间轮转 RotatingFileHandler根据文件大小轮转 但是内置的这些handler是多线程安全的,而不支持多进程(可以修改源码加锁

  • python 多进程和多线程使用详解

    进程和线程 进程是系统进行资源分配的最小单位,线程是系统进行调度执行的最小单位: 一个应用程序至少包含一个进程,一个进程至少包含一个线程: 每个进程在执行过程中拥有独立的内存空间,而一个进程中的线程之间是共享该进程的内存空间的: 计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 假定工厂的电力有限,一次只能供给一个车间使用.也就是说,一个车间开工的时候,其他车间都必须停工.背后的含义就是,单个CPU一次只能运行一个任务.编者注: 多核的CPU就像有了多个发电厂,使多工厂

  • python实现多进程并发控制Semaphore与互斥锁LOCK

    一.了解锁 应用场景举例描述: Lock 互斥锁:举例说明–有三个同事同时需要上厕所,但是只有一间厕所,将同事比作进程,多个进程并打抢占一个厕所,我们要保证顺序优先, 一个个来,那么就必须串行,先到先得,有人使用了,就锁住,结束后剩余的人继续争抢 1.利用Lock来处理 模拟三个同事抢占厕所 from multiprocessing import Process from multiprocessing import Lock import time import random def task

  • Python多进程的使用详情

    目录 一.进程的创建 1.一些常用方法介绍 二.进程池的使用 三.多进程和多线程的优缺点对比 一.进程的创建 Python的multiprocessing模块提供了Process类,该类可用来在各平台下创建新进程.其构造函数是: __init__(self, group=None, target=None, name=None, args=(), kwargs={}) 其中,各个参数的含义如下: group: 该参数未实现,不需要传参 target:为新建进程指定执行任务,也就是指定一个函数 a

  • Python多进程机制实例详解

    本文实例讲述了Python多进程机制.分享给大家供大家参考.具体如下: 在以前只是接触过PYTHON的多线程机制,今天搜了一下多进程,相关文章好像不是特别多.看了几篇,小试了一把.程序如下,主要内容就是通过PRODUCER读一个本地文件,一行一行的放到队列中去.然后会有相应的WORKER从队列中取出这些行. import multiprocessing import os import sys import Queue import time def writeQ(q,obj): q.put(o

  • Python多进程分块读取超大文件的方法

    本文实例讲述了Python多进程分块读取超大文件的方法.分享给大家供大家参考,具体如下: 读取超大的文本文件,使用多进程分块读取,将每一块单独输出成文件 # -*- coding: GBK -*- import urlparse import datetime import os from multiprocessing import Process,Queue,Array,RLock """ 多进程分块读取文件 """ WORKERS = 4

  • 探究Python多进程编程下线程之间变量的共享问题

     1.问题: 群中有同学贴了如下一段代码,问为何 list 最后打印的是空值? from multiprocessing import Process, Manager import os manager = Manager() vip_list = [] #vip_list = manager.list() def testFunc(cc): vip_list.append(cc) print 'process id:', os.getpid() if __name__ == '__main_

  • Python多进程multiprocessing用法实例分析

    本文实例讲述了Python多进程multiprocessing用法.分享给大家供大家参考,具体如下: mutilprocess简介 像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多. 简单的创建进程: import multiprocessing def worker(num): """thread worker function""" print 'Wor

  • Python多进程并发(multiprocessing)用法实例详解

    本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU核心. Python提供了非常好用的多进程包multiprocessing,你只需要定义一个函数,Python会替你完成其他所有事情.借助这个包,可以轻松完成从单进程到并发执行的转换. 1.新建单一进程 如果我们新建少量进程,可以如下: import multiprocessing import t

  • Python多进程同步简单实现代码

    本文讲述了Python多进程同步简单实现代码.分享给大家供大家参考,具体如下: #encoding=utf8 from multiprocessing import Process, Lock def func(lock, a): lock.acquire() print a lock.release() if __name__ == '__main__': lock = Lock() workers = [] # 创建两个进程 for i in range(0, 2): p = Process

  • Python 多进程和数据传递的理解

    Python 多进程和数据传递的理解 python不仅线程用的是系统原生线程,进程也是用的原生进程 进程的用法和线程大同小异 import multiprocessing p = multiprocessing.Process(target=fun,args=()) 线程的基本方法在进程中都能够使用 但是进程和线程中有一个明显的区别:可以实现多核的运用 python本身会启动一个主进程,并且拥有一个主线程把主进程看做一家之主,那主线程也是他本身,其他线程就相当于老婆们 而进程,长大了的儿子们,线

  • 深入理解python多进程编程

    1.python多进程编程背景 python中的多进程最大的好处就是充分利用多核cpu的资源,不像python中的多线程,受制于GIL的限制,从而只能进行cpu分配,在python的多进程中,适合于所有的场合,基本上能用多线程的,那么基本上就能用多进程. 在进行多进程编程的时候,其实和多线程差不多,在多线程的包threading中,存在一个线程类Thread,在其中有三种方法来创建一个线程,启动线程,其实在多进程编程中,存在一个进程类Process,也可以使用那集中方法来使用:在多线程中,内存中

  • Python多进程编程技术实例分析

    本文以实例形式分析了Python多进程编程技术,有助于进一步Python程序设计技巧.分享给大家供大家参考.具体分析如下: 一般来说,由于Python的线程有些限制,例如多线程不能充分利用多核CPU等问题,因此在Python中我们更倾向使用多进程.但在做不阻塞的异步UI等场景,我们也会使用多线程.本篇文章主要探讨Python多进程的问题. Python在2.6引入了多进程的机制,并提供了丰富的组件及api以方便编写并发应用.multiprocessing包的组件Process, Queue, P

随机推荐