python3中的进程

简介: 由于GIL的存在,python中的多线程并不是真正的多线程。如果想要充分的使用多核CPU的资源,在python中大部分情况需要使用多进程。在计算机中,进程与进程这之间在内存中是相互独立的,是两块完全不同的内存空间,而且相互之间没有任何联系。

由于GIL的存在,python中的多线程并不是真正的多线程。

如果想要充分的使用多核CPU的资源,在python中大部分情况需要使用多进程。

在计算机中,进程与进程这之间在内存中是相互独立的,是两块完全不同的内存空间,而且相互之间没有任何联系。

在线程之中,在全局定义一个变量,所有的线程都是共用的,但是不同的进程之间的数据则不是公有的。

multiprocessing包是python中的多进程管理包。

threading.Thread类似,myltiprocessing模块可以利用multiprocessing.Process对象来创建一个子进程。

multiprocessing的很大一部分用法与threading使用同一套API

Process对象与Thread对象的用法相同,也有start(),run()和join()的方法。

此外multiprocessing包中也有Lock,Event,Smaphore,Condition类,这些对象可以像多线程那样,通过参数传递给各个进程,以实现同步进程。

1.进程的创建:

大家在用chrome浏览器浏览网页的时候,打开任务管理器,会看到chrome的进程会不止一个,那么怎么在在一段py程序里面开辟一个子进程呢??

python中子进程的创建有两种方法:

1.通过Process类调用

import multiprocessing
import time

def func():
    print("hello world------>",time.ctime())
    time.sleep(2)   #让系统休眠2S
    print("func ending------>",time.ctime())

if __name__ == "__main__":
    p1=multiprocessing.Process(target=func,args=()) #实例化一个进程
    p1.start()  #启动进程
    print("ending------>",time.ctime())     #计算程序执行所花费的时间 

这样就创建一个进程,如果电脑的CPU是多核的话,这两个程序就会并行执行。

执行程序,程序最后一句"ending"和"hello world"会同进打印在屏幕上,然后程序休眠2s,又会在屏幕上打印一句"func ending",程序执行结束。

在程序执行期间,打开任务管理器,会看到进程列表中有两个python.exe的进程,等到程序执行完成,这两个python.exe的进程又会消失。
程序执行结果:

ending------> Thu Jul 20 15:56:17 2017
hello world------> Thu Jul 20 15:56:17 2017
func ending------> Thu Jul 20 15:56:19 2017

2.继承Process类调用

from multiprocessing import Process
import time

class MyProcess(Process):   #定义一个类,这个类继承multiprocessing.Process这个类
    def __init__(self,i):
        super(MyProcess,self).__init__()
        self.i=i

    def run(self):
        print("%s hello python------>"%self.i,time.ctime())
        time.sleep(2)

if __name__=="__main__":
    p_list=[]
    for i in range(3):
        p1=MyProcess(i) #实例化进程
        p1.start()      #启动进程
        p_list.append(p1)

    for item in p_list:
        item.join()     #阻塞主进程,全子进程执行完毕再执行主进程

    print("ending------>",time.ctime())     #计算程序执行所花费的时间

利用类的继承,创建了3个进程,这三个进程同时在屏幕在打印自身的编号及一句话,然后程序休眠2s后,又会打印结束话语。

在程序的执行过程中,查看系统进程列表,会看到python解释器的进程编号:

E:\py_code>tasklist | findstr python
python.exe                    5760 Console                    1     11,524 K
python.exe                    3488 Console                    1     11,616 K
python.exe                    6900 Console                    1     11,672 K
python.exe                    4384 Console                    1     11,636 K

程序执行结果:

1 hello python------> Thu Jul 20 16:05:07 2017
2 hello python------> Thu Jul 20 16:05:07 2017
0 hello python------> Thu Jul 20 16:05:07 2017
ending------> Thu Jul 20 16:05:09 2017

2.进程的使用方法:

来看下面的例子:
让系统执行一段范围内的累加和累乘操作,计算CPU执行这两个操作所花的时间。
第一种方式:正常的定义两个函数,然后执行程序。

def func1(x):
    res1=0
    for i in range(x):
        res1 += i   #累加计算的结果
    return res1

def func2(y):
    res2=1
    for i in range(1,y):
        res2 *= i    #累乘计算的结果
    return res2

s1=time.time()
func1(100000000)    #执行累加函数
func2(100000)       #执行累乘函数
s2=time.time()
print("cost time:%s"%(s2-s1))   #计算程序执行所花费的时间 

程序返回结果:

cost time:9.273045301437378

第二种方式,使用程序执行另外两个进程,分别调用系统资源来运算,计算CPU所花费的时间。

from multiprocessing import Process
import time

def func1(x):
    res1=0
    for i in range(x):
        res1 += i
    return res1

def func2(y):
    res2=1
    for i in range(1,y):
        res2 *= i
    return res2

if __name__=="__main__":
    t1=time.time()
    p1=Process(target=func1,args=(100000000,))  #实例化进程p1
    p1.start()  #启动进程p1

    p2=Process(target=func2,args=(100000,))     #实例化进程p2
    p2.start()  #启动进程pp2

    p1.join()
    p2.join()

    print("ending")
    t2=time.time()
    print("cost time:%s"%(t2-t1))       #计算程序运行所花费的时间

执行程序,查看系统的任务管理器,可以看到程序在运行的过程中,生成了三个进程。

E:\py_code>tasklist | findstr python
python.exe                    6520 Console                    1     11,536 K
python.exe                    4340 Console                    1     11,612 K
python.exe                    6200 Console                    1     12,240 K

程序执行结果:

ending
cost time:5.437908697128296

可以看到,第二段代码里面有三个进程(一个主进程和两个子进程p1,p2),

同时在执行这两个函数,所以CPU在执行这两个运行的时候所花的时间会少一些的原因。

3.python中,多进程的优缺点:

优点:
    可以利用多核,以实现并形运算
    
缺点:

    1.浪费的系统资源比较多
    2.进程之间的通信比较困难

4.multiprocessing中的Process类中内置方法及用法:

在系统的提示符下,导入multiprocessing模块,使用:

import multiprocessing

查看这个模块的内置的方法:

help(multiprocessing.Process)
multiprocessing.Process内置方法:
构造方法:
    group               线程组
    target              要执行的方法
    name                进程的名
    args/kwargs         执行过程中要传入的参数 

实例方法:
    is_alive()          测试进程是否在运行
    join([timeout])     阻塞当前上下文环境的进程,直到调用此方法的进程终止或到达指定的timeout
    start()             进程准备就绪,等待CPU调度
    run()               start()调用run方法,如果实例进程未制定传入target时,这start执行默认的run()方法    
    terminate()         不管任务是否完成,立即停止工作进程 

属性:
    deamon              和线程的setDeamon功能一样
    name                进程的名字
    pid(ident)          进程号
    ppid                进程的父进程号

Process内置方法的用法:
代码如下:

from multiprocessing import Process
import os
import time
def info(name):
    print("process name:",name)     #打印当前进程的进程名
    print("parent process:",os.getppid())       #打印当前进程的父进程ID号
    print("process:",os.getpid())   #打印当前进程的进程ID号
    print("---------")
    time.sleep(10)

def foo(name):
    info(name)

if __name__=="__main__":
    info("main process")

    p1=Process(target=info,args=("process1",))
    p1.start()
    p1.join()

    p2=Process(target=foo,args=("process2",))
    p2.start()
    p2.join()

    print("ending")

程序执行过程中,打开系统的任务管理器,查找python的进程可以看到:

E:\py_code>tasklist | findstr python
python.exe                    2424 Console                    1     11,536 K
python.exe                    5360 Console                    1     11,632 K
python.exe                    2532 Console                    1     11,664 K

执行程序,返回结果如下:

process name: main process line
parent process: 628
process: 2424
---------   
process name: process1
parent process: 2424
process: 2532
---------
process name: process2
parent process: 2424
process: 5360
---------
ending

可以看到process1process2的进程名和进程号,这两个进程的父进程号都是一样的,都是主进程的进程号。

5.注意事项

需要注意的是,python的进程之间的切换,耗费的系统资源比线程的切换耗费的资源多得多。

目录
相关文章
|
17天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
29天前
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
53 1
|
2月前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
2月前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
31 3
|
3月前
|
负载均衡 Java 调度
探索Python的并发编程:线程与进程的比较与应用
本文旨在深入探讨Python中的并发编程,重点比较线程与进程的异同、适用场景及实现方法。通过分析GIL对线程并发的影响,以及进程间通信的成本,我们将揭示何时选择线程或进程更为合理。同时,文章将提供实用的代码示例,帮助读者更好地理解并运用这些概念,以提升多任务处理的效率和性能。
60 3
|
2月前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
24 0
|
3月前
|
消息中间件 安全 Kafka
Python IPC机制全攻略:让进程间通信变得像呼吸一样自然
【9月更文挑战第12天】在编程领域,进程间通信(IPC)是连接独立执行单元的关键技术。Python凭借简洁的语法和丰富的库支持,提供了多种IPC方案。本文将对比探讨Python的IPC机制,包括管道与消息队列、套接字与共享内存。管道适用于简单场景,而消息队列更灵活,适合高并发环境。套接字广泛用于网络通信,共享内存则在本地高效传输数据。通过示例代码展示`multiprocessing.Queue`的使用,帮助读者理解IPC的实际应用。希望本文能让你更熟练地选择和运用IPC机制。
61 10
|
3月前
|
监控 Ubuntu API
Python脚本监控Ubuntu系统进程内存的实现方式
通过这种方法,我们可以很容易地监控Ubuntu系统中进程的内存使用情况,对于性能分析和资源管理具有很大的帮助。这只是 `psutil`库功能的冰山一角,`psutil`还能够提供更多关于系统和进程的详细信息,强烈推荐进一步探索这个强大的库。
47 1
|
3月前
|
安全 开发者 Python
Python IPC大揭秘:解锁进程间通信新姿势,让你的应用无界连接
【9月更文挑战第11天】在编程世界中,进程间通信(IPC)如同一座无形的桥梁,连接不同进程的信息孤岛,使应用无界而广阔。Python凭借其丰富的IPC机制,让开发者轻松实现进程间的无缝交流。本文将揭开Python IPC的神秘面纱,介绍几种关键的IPC技术:管道提供简单的单向数据传输,适合父子进程间通信;队列则是线程和进程安全的数据共享结构,支持多进程访问;共享内存允许快速读写大量数据,需配合锁机制确保一致性;套接字则能实现跨网络的通信,构建分布式系统。掌握这些技术,你的应用将不再受限于单个进程,实现更强大的功能。
67 6
|
2月前
|
数据采集 消息中间件 Python
Python爬虫-进程间通信
Python爬虫-进程间通信