进程

作者: 骚X | 来源:发表于2019-03-07 20:09 被阅读0次

什么是进程?

一个程序运行起来后,代码+用到的资源称之为进程,它是操作系统分配资源的基本单元

进程额创建-multiprocessing

mutiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情
from multiprocessing import Process
import time

def run_proc():
"""子进程要执行的代码"""
while True:
       print("2")
       time.sleep(1)

if __name__ == '__main__':
p = Process(target=run_proc)
p.start()
while True:
    print("1")
    time.sleep(1)

Process参数如下:

Process(group,target,name,args,kwargs)
  • targest:如果传递了函数的引用,可以任务这个子进程就执行这里代码
  • args:给target指定的函数传递的参数,以元祖的方式传递
  • kwargs:给target指定的函数传递命名参数
  • name:给进程设定一个名字,可以不设定
  • group:指定进程组,大多数情况下用不到
Process创建的实例对象的常用方法:
  • strart():启动子进程实例(创建子进程)
  • is_alive():判断进程子进程是否还在活着
  • join([timeout]):是否等待子进程执行结束,或等待多少秒
  • terminate():不管任务是否完成,立即终止子进程

Process创建的实例对象的常用属性:

  • name:当前进程的别名,默认为Process-N,N为1开始递增的整数
  • pid:当前进程的pid(进程号)

进程间通信-Queue

  • Queue的使用可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息列队程序,以下小实例来演示一下Queue的工作原理
#coding=utf-8
from multiprocessing import Queue
q=Queue(3) #初始化一个Queue对象,最多可接收三条put消息
q.put("消息1")
q.put("消息2")
print(q.full()) #False
q.put("消息3")
print(q.full()) #True

#因为消息列队已满下面的try都会抛出异常,第一个try会等待2秒后再抛出异常,第二个Try会立刻抛出异常
try:
    q.put("消息4",True,2)
except:
print("消息列队已满,现有消息数量:%s"%q.qsize())

try:
    q.put_nowait("消息4")
except:
    print("消息列队已满,现有消息数量:%s"%q.qsize())

#推荐的方式,先判断消息列队是否已满,再写入
if not q.full():
q.put_nowait("消息4")

#读取消息时,先判断消息列队是否为空,再读取
if not q.empty():
    for i in range(q.qsize()):
    print(q.get_nowait())
  • Queue.qsize():返回当前队列包含的消息数量;
  • Queue.empty():如果队列为空,返回Ture,反之False:
  • Queue.full():如果队列满了,返回True,反之False:
  • Queue.get(block,timeout):获取队列中的一条消息,然后将其从列队中移除,默认值为True:

进程池Pool

  • 当需要创建的子进程数量不多时,可以直接利用multirocessing中的Process动态生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作两巨大,就可以用到mulitiprocessing模块提供的Pool方法
  • 初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新任务,请看下面的实例:

    -- coding:utf-8 --

      from multiprocessing import Pool
      import os, time, random
    
      def worker(msg):
      t_start = time.time()
      print("%s开始执行,进程号为%d" % (msg,os.getpid()))
      # random.random()随机生成0~1之间的浮点数
      time.sleep(random.random()*2)
      t_stop = time.time()
      print(msg,"执行完毕,耗时%0.2f" % (t_stop-t_start))
    
      po = Pool(3) # 定义一个进程池,最大进程数3
    for i in range(0,10):
    # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
    # 每次循环将会用空闲出来的子进程去调用目标
    po.apply_async(worker,(i,))
    
    print("----start----")
    
    po.close() # 关闭进程池,关闭后po(进程池)不再接收新任务
      po.join() # 等待po(进程池)中所有子进程执行完成,必须放在close语句之后
    
    print("-----end-----")
    

相关文章

  • 进程,进程,进程

    1. 进程是具有独立功能的程序关于某个数据集合的一次运行过程。(1)程序本身是静态的,是没有生命周期的,只有运行起...

  • Linux回收子进程

    孤儿进程 孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程...

  • Android 五种进程的管理

    安卓有几种进程? 前台进程 可见进程 服务进程 后台进程 空进程 前台进程 用户当前操作所必需的进程。如果一个进程...

  • 孤儿进程、僵尸进程与进程回收

    孤儿进程与僵尸进程 孤儿进程:父亲死了,子进程被init进程领养僵尸进程:子进程死了,父进程没有回收子进程的资源(...

  • 第三章 进程管理

    进程基础 进程基本概念 进程组:只包括祖先进程,子孙进程,兄弟进程进程树:所有进程僵尸进程:在父进程中经常会调用w...

  • Chaprter-1 [进程]

    进程模型 进程定义 进程的创建 进程的终止 进程的层次结构 进程的状态 进程的状态图 进程的实现

  • 进程操作

    一、进程创建 进程树 父进程创建若干子进程,子进程再创建其子进程,依次类推,构成进程树。进程的调度,其实就是在进程...

  • 进程管理(一)进程操作

    进程创建 、进程执行映像和加载、进程运行(进程调度)、进程间的互斥与同步、进程间通信、进程终止 1、进程创建 PC...

  • python中的僵尸进程和孤儿进程

    孤儿进程:父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被 init 进程(进程号为 1)所收养,...

  • 容器中的孤儿进程&僵尸进程简介

    背景简介 孤儿进程 父进程先于子进程退出,那么子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)接管,并...

网友评论

      本文标题:进程

      本文链接:https://www.haomeiwen.com/subject/sxvhpqtx.html