进程

作者: 鲸随浪起 | 来源:发表于2018-12-05 21:27 被阅读0次

创建进程就是为了执行多任务代码

多任务就是操作系统可以同时运行多个任务

代码没有在运行的时候叫程序,
代码在运行的时候交做进程

时间片轮转

并发:任务数量大于核心数,两个或多个时间在同一时间间隔发生
并行:任务数量小于或等于核心数,两个或多个时间在同一时间发生

进程的创建-multiprocessing

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

Process创建进程

函数用法:

from multiprocessing import Process
import os
from time import sleep

#age元组形式传递参数,**kwargs字典形式传入
def run_proc(name,age,**kwargs):
    for i in range(10):
        print('子进程运行中,name=%s,age=%d,pid=%d'%(name,age,os.getpid()))
        print(kwargs)
        sleep(0.2)
if __name__ == '__main__':
    #创建一个进程对象
    p = Process(target=run_proc,args=('text',18),kwargs={"m":20})
    #开始执行
    p.start()
    # sleep(1)
    # p.terminate() #1秒后不管任务是否完成,立即终止子程序
    p.join(0.2)    #等待子程序执行0.2秒后执行
    print('---main---')

类用法:

from multiprocessing import Process
from time import sleep

#类继承Process
class NewProcess(Process):
    def __init__(self,name,age):
        super(NewProcess,self).__init__()
        self.name = name
        self.age = age
    def run(self):
        while True:
            print("---1---%s,%s"%(self.name,self.age))
            sleep(1)
if __name__ == '__main__':
    #传递参数
    p = NewProcess("aa",15)
    p.start()
    sleep(5)
    p.terminate()
    print("主进程结束...")

POOL进程池

当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法

from multiprocessing import Pool
import os

def worker(num):
    for i in range(5):
        print("pid:%d,num:%d"%(os.getpid(),num))

if __name__ == '__main__':
    #最多有3个进程一起执行
    pool = Pool(3)
    for i in range(10):
        print("%d"%i)
        #向进程池添加任务
        pool.apply_async(worker,(i,))
    #关闭进程池,相当于不能够再次添加新的任务
    pool.close()
    #主进程 创建/添加 任务后,主进程默认不会等待进程池中的任务执行完后才结束
    #而是当主进程的任务做完后,立马结束
    #如果这个地方没join会导致进程池中的任务不会执行
    pool.join()

fork进程

fork只能在linux中运行,windows中不支持

主进程返回值大于0
子进程返回值等于0
os.getpid() 当前进程标识,标识就是进程识别码
os.getppid() 父进程标识

import os 
#res有两个值,一个0,一个大于0的值
res=os.fork()
if res>0:
    print(父进程:%d%os.getpid())
else:
    print('子进程:%d,他的父进程是:%d%(os.getpid(),os.getppid()))

1.如果主进程先退出了,说明进程已经退出了,不会因为子进程没有结束,主进程等待
2.全局变量在多个进程中不共享

fork的4个进程

执行到1和2分别去执行11和22

import os 
import time 
ret = os.fork()
if ret == 0: 
    print(---1---)
else: 
    print(---2---)
ret = os.fork()
if ret == 0: 
    print(---11---)
else: 
    print(---22---)

结果:

---1---
---11---
---22---
---2---
---11---
---22---

fork3个进程

import os
ret=os.fork()
if ret==0:
    print("---1---")
else:
    ret=os.fork()
    if ret==0:
        print("---11---")
    else:
        print("---22---")

相关文章

  • 进程,进程,进程

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

  • Linux回收子进程

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

  • Android 五种进程的管理

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

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

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

  • 第三章 进程管理

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

  • Chaprter-1 [进程]

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

  • 进程操作

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

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

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

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

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

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

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

网友评论

      本文标题:进程

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