进程的调用

1896-刘同学

发表文章数:31

热门标签

,
首页 » Python » 正文


提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文主要介绍进程相关的概念


提示:以下是本篇文章正文内容,下面案例可供参考

一、进程的相关的概念?

'''
生活中,你可能一边听歌,一边写作业;一边上网,一边吃饭。。。这些都是生活中的多任务场景。电脑也可以执行多任务,比如你可以同时打开浏览器上网,听音乐,打开pycharm编写代码...。简单的说**多任务就是同一时间内运行多个程序**

- 单核CPU实现多任务原理:操作系统轮流让各个任务交替执行,QQ执行2us,切换到微信,在执行2us,再切换到陌陌,执行2us……。表面是看,每个任务反复执行下去,但是CPU调度执行速度太快了,导致我们感觉就行所有任务都在同时执行一样

- 多核CPU实现多任务原理:真正的秉性执行多任务只能在多核CPU上实现,但是由于任务数量远远多于CPU的核心数量,所以,操作西永也会自动把很多任务轮流调度到每个核心上执行

- 并发和并行
  - **并发**:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。
  - **并行**:当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
- 实现多任务的方式:
  - 多进程模式;
  - 多线程模式;
  - 协程。
  进程  >  线程  >  协程
  
  from multiprocessing import Process
  
  Process(target = 函数 ,name= 进程的名字,args=(给函数传递的参数))
  process.start() 启动进程并执行任务
  process.run()  只是执行了任务但是没有启动进程
  terminate() 终止
  
'''

二、进程

1. 进程的创建

# 进程创建
'''

 多进程对于全局变量访问,在每一个全局变量里面都放一个m变量,
 保证每个进程访问变量互不干涉
m=1  #不可变类型
list1=[] #可变类型
'''
import os
from multiprocessing import Process   #导入进程模块
from time import sleep
m=1  #不可变类型
list1=[] #可变类型

def task1(s,name):
    global m
    while True:
        sleep(s)
        m+=1
        list1.append(str(m)+'task1')
        print('这是任务1.。。。。。。。。。。',os.getpid(),'------',os.getppid(),m,list1)


def task2(s,name):
    global m
    while True:
        sleep(s)
        m+=1
        list1.append(str(m)+'task2')
        print('这是任务2.。。。。。。。。。。',os.getpid(),'------',os.getppid(),m,list1)

number=1
if __name__ == '__main__':
    print(os.getpid())       #打印父进程的进程号
    # 子进程
    p = Process(target=task1, name='任务1',args=(1,'aa'))
    p.start()
    print(p.name)
    p1 = Process(target=task2, name='任务2',args=(2,'bb'))
    p1.start()
    print(p1.name)
    while True:
        sleep(1)
        m+=1
        print('------------>main:',m)

进程的调用

进程的调用

# 进程创建
import os
from multiprocessing import Process   #导入进程模块
from time import sleep


def task1(s,name):
    while True:
        sleep(s)
        print('这是任务1.。。。。。。。。。。',os.getpid(),'------',os.getppid(),name)


def task2(s,name):
    while True:
        sleep(s)
        print('这是任务2.。。。。。。。。。。',os.getpid(),'------',os.getppid(),name)

number=1
if __name__ == '__main__':
    print(os.getpid())       #打印父进程的进程号
    # 子进程
    p = Process(target=task1, name='任务1',args=(1,'aa'))
    p.start()
    print(p.name)
    p1 = Process(target=task2, name='任务2',args=(2,'bb'))
    p1.start()
    print(p1.name)
    while True:
        number +=1
        sleep(0.1)
        if number==100:
            p.terminate()
            p1.terminate()
            break
        else:
            print('--------------> number',number)
    print('--------------')
    print('*****************')

2 自定义进程

# 进程: 自定义
from multiprocessing import Process
class MyProcess (Process):
    def __init__(self,name):
        super(MyProcess,self).__init__()
        self.name=name
    # 重写run 方法:
    def run(self):
        n=1
        print('进程名字:'+self.name)
        print('--------->自定义进程,n:{}'.format(n,self.name))
        n +=1

if __name__ == '__main__':
    p=MyProcess('小明')
    p.start()

    p1=MyProcess('小红')
    p1.start()

3 什么是阻塞式进程池和非阻塞式进程池

3.1 非阻塞式进程池


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

非阻塞式:全部添加到队列中,立刻返回,并没有等待其他的进程完毕,但是回调函数是等待任务完成之后才调用。


非阻塞式: 全部添加到队列中,立刻返回,并没有等待其他的进程完毕,但是回调函数是等待任务完成之后才调用
非阻塞式:
'''

from multiprocessing import Pool
#非阻塞式进程
import time
from  random import  random
import os
def task(task_name):
    print("开始做任务啦!",task_name)
    start=time.time()
    #使用sleep
    time.sleep(random()*2)
    end=time.time()
    #print("完成{}任务!用时:{},进程id{}".format(task_name,(end-start),os.getpid()))
    return "完成{}任务!用时:{},进程id{}".format(task_name,(end-start),os.getpid())

container=[]
def callback_func(n):
    container.append(n)

if __name__=='__main__':
    pool=Pool(5)
    tasks=['听歌','吃饭','洗衣服','打游戏','散步','看孩子','做饭']
    for task1 in tasks:
        pool.apply_async(task,args=(task1,),callback=callback_func)  #表示的是非阻塞式
    pool.close()  #添加任务结束
    pool.join() #阻塞主进程,不继续执行打印over
    for c in  container:
        print(c)
    print('over!!!')

进程的调用

3.2 阻塞式进程池

from multiprocessing import Pool
import time
from  random import  random
import os

'''
  特点:
  添加一个执行一个,如果一个任务不结束另一个任务就进不来
  进程池:
  pool=Pool(max)  创建进程池对象
  pool.apply() 阻塞的
  pool.apply_async() 非阻塞的
  
  pool.close()
  pool.join()   让主进程让步
  

'''
def task(task_name):
    print("开始做任务啦!",task_name)
    start=time.time()
    #使用sleep
    time.sleep(random()*2)
    end=time.time()
    print("完成{}任务!用时:{},进程id{}".format(task_name,(end-start),os.getpid()))
    #return "完成{}任务!用时:{},进程id{}".format(task_name,(end-start),os.getpid())



if __name__ == '__main__':
    pool=Pool(5)
    tasks = ['听歌', '吃饭', '洗衣服', '打游戏', '散步', '看孩子', '做饭']
    for task1 in tasks:
        pool.apply(task, args=(task1,))
    pool.close()
    pool.join()
    print('over!!!')

进程的调用

标签:

未经允许不得转载:作者:1896-刘同学, 转载或复制请以 超链接形式 并注明出处 拜师资源博客
原文地址:《进程的调用》 发布于2021-10-12

分享到:
赞(0) 打赏

评论 抢沙发

评论前必须登录!

  注册



长按图片转发给朋友

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

Vieu3.3主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录