Python进程

对python进程的介绍,对进程的实现、进程间的关系、进程池、进程间通信。


多任务:

什么叫多任务:

操作系统可以同时运行多个任务,现代的操作系统比如Windows、Mac OS X、Linux、Unix等都是支持多任务的系统

为什么要实现多任务:

想效率高,不卡顿

实现多任务的方式

    1、多进程模式:启动多个进程,每个进程虽然只有一个线程,但是多个进程可以一起执行多个任务

    2、多线程模式:启动一个进程,在一个进程的内部启动多个线程,这样多个线程也可以一起执行多个任务

    3、多进程+多线程:启动多个进程,每个进程再启动多个线程

    4、协程

    5、多进程+协程

进程:

什么是进程:

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体

对于操作系统来说,一个任务就是一个进程。比方说打开浏览器就是启动一个浏览器的进程,在打开一个记事本就启动一个记事本进程,如果打开两个记事本就启动两个记事本进程。

进程的实现:

from multiprocessing import Process

from time import sleep

 

multiprocessing模块

1、跨平台的多进程模块

2、提供了一个Process类代表一个进程对象

 

def run(name, description):

    while True:

        print("%s is a %s man!"%(name, description))

        sleep(1)

if __name__ == "__main__":

    #程序启动的进程称为主进程(父进程)

 

    #创建进程(子进程)

    p = Process(target=run, args=("sunck", "handsome"))

    #启动子进程

    p.start()

    while True:

        print("kaige is a nice man")

        sleep(1.2)

进程之间的关系:

from multiprocessing import Process

from time import sleep

def run():

    print("启动子进程")

    sleep(3)

    print("结束子进程")

def run2():

    print("启动子进程2")

    sleep(3)

    print("结束子进程2")

if __name__ == "__main__":

    print("启动主进程")

    p = Process(target=run)

    p.start()

    p2 = Process(target=run2)

    p2.start()

    #主进程的结束不能影响子进程,随意可以等待子进程结束在结束主进程

    #等待子进程结束,才能继续执行主进程

    #后期主进程主要做的是调度相关的工作,不具体负责业务逻辑

    p.join()

    p2.join()

    print("结束主进程")

启动大量进程:进程池

import os

import time

import random

from multiprocessing import Process, Pool

def run(name):

    # os.getpid()获取当前进程的进程ID

    print("子进程%s启动--%s"%(name, os.getpid()))

    t1 = time.time()

    time.sleep(random.random()*5)

    t2 = time.time()

    print("子进程%s结束--%s--耗时%.2f" % (name, os.getpid(), t2-t1))

if __name__ == "__main__":

    print("启动父进程")

    #进程池

    #表示可以同时执行的进程数量

    #由于Pool的默认值为CPU的核心数量,如果有4个核心,则至少需要子进程才能看到等待的效果

    pool = Pool(4)

    for i in range(3):

        # 创建进程放入进程池中统一管理

        pool.apply_async(run, args=(i,))

    # 进程池对象调用join之前必须先调用close,调用close之后就不能向进程池中添加进程了

    pool.close()

    #Pool对象调用join方法,会等待所有子进程结束再执行主进程

    pool.join()

print("结束父进程")

进程间通信:

有名管道

无名管道

队列

共享内存

信号

信号量

 

from multiprocessing import Process, Queue

import time

import random

def produce(q):

    print("启动produce子进程……")

    time.sleep(5)

    for value in ["good", "nice", "cool", "handsome"]:

        print("将%s放入队列"%value)

        q.put(value)

        time.sleep(random.random())

    print("结束produce子进程……")

def customer(q):

    print("启动customer子进程……")

    while True:

        print("消费者等待数据")

        value = q.get(True)

        print("消费者消费%s条数据"%value)

    print("结束customer子进程……")

 

if __name__ == "__main__":

    q = Queue()

    pro = Process(target=produce, args=(q,))

    cus = Process(target=customer, args=(q,))

    pro.start()

    cus.start()

    pro.join()

    #cus进程里是死循环,无法等待它的结束,只能强制结束该子进程

    cus.terminate()

    print("END")

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值