多进程

2023-05-16

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

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

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

- 并发和并行
  - **并发**:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。
  - **并行**:当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
- 实现多任务的方式:
  - 多进程模式;
  - 多线程模式;
  - 协程。
  进程  >  线程  >  协程
'''

# 进程创建
import os
from multiprocessing import Process
from time import sleep


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


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


if __name__ == '__main__':
    print(os.getpid())
    # 子进程
    p = Process(target=task1, name='任务1')
    p.start()
    print(p.name)
    p1 = Process(target=task2, name='任务2')
    p1.start()
    print(p1.name)

    print('--------------')
    print('*****************')
from multiprocessing import Process

  process = Process(target= 函数,name=进程的名字,args=(给函数传递的参数))
  process 对象

  对象调用方法:
  process.start()    启动进程并执行任务
  process.run()  只是执行了任务但是没有启动进程
  terminate()   终止
'''

# 进程创建
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.2)
        if number == 12:
            p.terminate()
            p1.terminate()
            break
        else:
            print('---------------->number:',number)

    print('--------------')
    print('*****************')

# 进程创建

'''
 多进程对于全局变量访问,在每一个全局变量里面都放一个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.。。。。。。。。。。', m, list1)


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


if __name__ == '__main__':

    # 子进程
    p = Process(target=task1, name='任务1', args=(1, 'aa'))
    p.start()

    p1 = Process(target=task2, name='任务2', args=(2, 'bb'))
    p1.start()

    while True:
        sleep(1)
        m += 1
        print('--------->main:', m)
# 进程间通信
from multiprocessing import Process, Queue
from time import sleep


def download(q):
    images = ['girl.jpg', 'boy.jpg', 'man.jpg']
    for image in images:
        print('正在下载:', image)
        sleep(0.5)
        q.put(image)


def getfile(q):
    while True:
        try:
            file = q.get(timeout=5)
            print('{}保存成功!'.format(file))
        except:
            print('全部保存完毕!')
            break


if __name__ == '__main__':
    q = Queue(5)
    p1 = Process(target=download, args=(q,))
    p2 = Process(target=getfile, args=(q,))

    p1.start()
    p1.join()

    p2.start()
    p2.join()

    print('00000000000')

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

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

阻塞式:
'''

import os
from multiprocessing import Pool
import time

# 非阻塞式进程
from random import random


def task(task_name):
    print('开始做任务啦!', task_name)
    start = time.time()
    # 使用sleep
    time.sleep(random() * 2)
    end = time.time()
    # print()
    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()  #

    for c in container:
        print(c)
    print('over!!!!!')
# 阻塞式
import os
import time
from multiprocessing import Pool
from random import random
'''
 特点:
 添加一个执行一个任务,如果一个任务不结束另一个任务就进不来。
 
 进程池:
 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()))


if __name__ == '__main__':
    pool = Pool(5)
    tasks = ['听音乐', '吃饭', '洗衣服', '打游戏', '散步', '看孩子', '做饭']
    for task1 in tasks:
        pool.apply(task, args=(task1,))
    pool.close()
    pool.join()
    print('over!!!!')
# 进程间通信
from multiprocessing import Queue

q = Queue(5)

q.put('A')
q.put('B')
q.put('C')
q.put('D')
q.put('E')
print(q.qsize())
if not q.full():  # 判断队列是否满    q.empty()  判断队列是否是空的
    q.put('F', timeout=3)  # put() 如果queue满了则只能等待,除非有‘空地’则添加成功
else:
    print('队列已满!')


# 获取队列的值
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
#print(q.get(timeout=2))

# q.put_nowait()
# q.get_nowait()

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多进程 的相关文章

  • C51内存类型

    bdata bdata内存类型只能用于声明变量 您不能声明bdata函数 该存储器使用8位地址直接访问 xff0c 是8051的片内位可寻址RAM 用bdata类型声明的变量是位可寻址的 xff0c 可以用位指令读写 code 代码存储器类
  • MQTT问题

    是否存在c gt ping outstanding 61 1 的后一秒就触发TimerIsExpired amp c gt last received span class token keyword int span span class
  • Failed to start apt-news.service Failed to start esm-cache.service

    luozw 64 luozw vpc etc apt apt conf d span class token function sudo span span class token function apt get span update
  • stm中断优先级理解+抢占优先级和相应优先级

    一 抢占优先级比子优先级的优先权更高 xff0c 这意味抢占优先级更高的中断会先执行 xff0c 而不管子优先级的优先权 xff0c 数值越低优先级越高 二 同理 xff0c 如果抢占优先级相同 xff0c 那么就会比较子优先级 xff0c
  • Realsense D435基于ROS跑通ORBSLAM2

    Realsense D435基于ROS跑通ORBSLAM2 系统ubuntu16 04 ROS Kinetic 相机RealsenseD435 SLAM系统 xff1a ORBSLAM2 一 安装Realsense的SDK 官方链接 htt
  • Qt学习:综合案例应用-上(翻金币小游戏)

    本案例是对Qt的基本控件 xff0c 事件处理 xff0c 资源文件的使用等知识的综合应用 以及一些开发思想和逻辑控制 首先了解下案例的文件构成 头文件 xff1a mainwindow h chooselevelscene h plays
  • 在TX2上运行realsenseD435摄像头

    在TX2上运行realsenseD435 先给出相关的链接在TX2上安装realsense SDK库在TX2上安装realsense SDK库 先给出相关的链接 github 上的一些链接 realsense SDK库 xff1a http
  • docker build 后面为什么要跟个 .

    我们在构建镜像文件时无非是使用 xff1a docker build t test ubuntu v1 或者 docker build f docker test Dockerfile 来进行构建镜像 xff0c 用第一个命令时任务 指代的
  • 微机原理中地址总线、数据总线与内存容量之间的关系

    今天在复习微机原理的时候 xff0c 看到一个概念 xff1a 存储总量 61 存储单元个数 存储字长 xff0c 然后存储单元个数 61 2 地址总线位数 xff0c 存储字长和数据总线位数有关 xff0c 如果是这样 xff0c 那么
  • HDLC——高级数据链路控制(HDLC,High-level Data Link Control)

    一 HDLC概述 1 1 HDLC的发展历史 高级数据链路控制 xff08 High Level Data Link Control或简称HDLC xff09 xff0c 是一个在同步网上传输数据 面向比特的数据链路层协议 xff0c 它是
  • 差分技术:LVDS(低压差分信号)、MLVDS(多点低压差分信号)的区别与应用场景

    差分传输是一种信号传输的技术 xff0c 区别于传统的一根信号线一根地线的做法 xff0c 差分传输在这两根线上都传输信号 xff0c 这两个信号的振幅相同 xff0c 相位相反 在这两根线上的传输的信号就是差分信号 信号接收端比较这两个电
  • 小白能理解的奈奎斯特采样及延伸出的理论

    一 取样定理 其实奈奎斯特采样有两种方式 xff0c 一种是矩形脉冲采样 xff0c 一种是冲激采样 xff0c 采样方式如下图 我们在不计算数学公式的情况下来讲解 xff0c 只是让大家明白是这么回事 xff0c 具体为什么是这样 xff
  • 单边谱和双边谱

    实际中 xff0c 只会有单边谱 xff0c 并不会有负频率的信号 在引入欧拉公式后 xff0c 出现了双边谱 单边谱转换为双边谱 xff0c 幅度会降低一半 xff0c 其他不变
  • 小白也能搞通UDP通信(88E1111 RGMII 接口)

    一 网络协议 下表描述了整个从上到下的网络协议层 xff1a 这些网络协议在FPGA实际开发的过程中用到的就是传输层 网络层 数据链路层和物理层 xff0c 在我们的举例中用到UDP IP ARP协议 xff0c 物理层就用88E1111
  • 485通讯和modbus通讯协议

    485通信 xff1a 采用差分信号 xff1a A比B电压高是1 xff0c A比B电压低是0 xff0c 电压高低值在0 2V 6V之间 硬件连接上 xff1a 所有A接到一起 xff0c 所有B接到一起AB之间要加匹配电阻100欧到1
  • MODBUS RTU

    Modbus xff1a 是一种单主 从通信协议 MODBUS网络上只有一个主站 xff0c 主站在MODBUS网络没有地址 xff0c 从站的地址范围为0 247 xff0c 其中0为广播地址 xff0c 从站的实际地址为1 247 MO
  • TM4C123-HWREG()及外设寄存器地址说明

    参考文件 xff1a ti TivaWare C Series 2 1 4 178 inc hw types hti TivaWare C Series 2 1 4 178 inc hw memmap htm4c123gh6pz datas
  • I2C协议

    物理层 xff1a 1 一个I2C总线中可连接多个I2C通信设备 xff0c 支持多个主机及多个从机 2 两线制 xff1a 一条双向串行通信的数据线 xff08 SDA xff09 xff0c 一条串行时钟线 xff08 SCL xff0
  • SPI协议

    物理层 xff1a 1 四线制或三线制 xff1a 四线制时3条总线分别为SCK MOSI MISO xff0c 片选线为NSS xff08 CS xff09 三线制与其不同的是MOSI和MISO合并为一条线 xff0c 端口为双向端口 x
  • 数据处理:修改rosbag topic的frame_id

    1 安装srv tools工具 git clone https github com srv srv tools git 将其作为功能包放到ros工作空间下编译即可 2 使用示例 rosrun bag tools change frame

随机推荐

  • STM32 Cubemax(十二) ——利用状态机实现按键的长短按和双击

    STM32 Cubemax 十二 利用状态机实现按键的长短按和双击 文章目录 STM32 Cubemax 十二 利用状态机实现按键的长短按和双击前言一 状态图二 Cubemax配置1 IO口配置2 定时器配置 三 代码1 编写有关按键的结构
  • python中的闭包函数

    闭包函数初探 通常我们定义函数都是这样定义的 def foo pass 其实在函数式编程中 xff0c 函数里面还可以嵌套函数 xff0c 如下面这样 def foo print 34 hello world in foo 34 def b
  • 树莓派+Ubuntu16.04 MATE+ROS(kinetic)的安装

    树莓派 43 Ubuntu16 04 MATE 43 ROS xff08 kinetic xff09 的安装 零 准备工作 1 树莓派板子 2 电源 xff1a 3A以上 xff0c 供电要充足 xff0c 否则无法启动或影响使用 3 显示
  • canal

    目录 搭建canal测试canal 监控MySQL的binlog的工具 搭建canal 1 开启mysql binlog cp usr share mysql my medium cnf etc my cnf 修改my cnf vim et
  • docker 镜像注册【图文教程】

    docker镜像官网 xff1a https hub docker com 进行登录注册 账号 只能使用4到30个字母和数字 那就名字拼音吧 邮箱 正确的邮箱即可 后续会验证 xff0c 务必真实 密码 密码至少为9个字符 第一个勾选框 偶
  • 使用gazebo实现turtlebot入门级开发

    实验室准备新进两台Turtlebot2 xff0c 为了更快上手 xff0c 便提前开始熟悉一下Turtlebot xff0c 通果查阅相关资料 xff0c 我写了一个demo程序 xff0c 并在gazebo模拟环境下进行了测试 该dem
  • 手写智能指针(类)

    基础知识 xff1a 智能指针的设计与实现 1 智能指针类将一个计数器与类指向的对象相关联 xff0c 引用计数跟踪该类有多少个对象共享同一指针 2 每次创建类的新对象时 xff0c 初始化指针并将引用计数置为1 xff1b 3 当对象作为
  • 求职历程

    前言 xff1a 个人求职有大部分的时间花在了城市与企业性质的纠结上 首先是个人打算 xff0c 因研究生课题偏嵌入式相关 xff0c 所以给自己定下的目标是找嵌入式相关的工作 xff0c 而弱化了互联网求职的刷题关和计算机基础关 而在求职
  • 剑指 Offer 57 - II. 和为s的连续正数序列

    剑指 Offer 57 II 和为s的连续正数序列 难度 简单 输入一个正整数 target xff0c 输出所有和为 target 的连续正整数序列 xff08 至少含有两个数 xff09 序列内的数字由小到大排列 xff0c 不同序列按
  • 使用层次遍历重建二叉树并遍历

    58同城的一道题 xff0c 蛮有意思的 利用层次遍历后的数组 xff0c 进行二叉树的重建 数值 1代表NULL 解题思路 xff1a 那么我们依然使用队列 xff0c 进行层次遍历 xff0c 进行重建 xff0c 这边有的问题是当示例
  • C++秋招知识点总结

    先介绍下本人的情况 xff0c 本人研究生双非院校 xff0c 本科也是普通二本 xff0c 也无实习无项目非科班出生 刷了将近半年的题和自学了相关知识点 xff0c 最终拿到华为 海康 大华 同花顺 深信服 CVTE 紫光展锐offer
  • MPU6050软件姿态解算

    我是勤劳的搬运工 转自 http blog sina com cn s blog c5a00db10102wd7d html http mini eastday com mobile 180306210610472 html 使用MPU60
  • AD布线的线宽

    线宽关系图 xff1a 覆铜厚度与电流的关系 xff1a
  • AD16 Unknown Pin 和Failed to add class member 问题

    转载 xff1a http www 51hei com bbs dpj 39227 1 html 相信很多人在使用DXP 和AD 的时候 xff0c 都遇到过Unknown Pin 和Failed to add classmember 的问
  • 加速度计求二次积分

    我是勤劳的搬运工 xff1a https blog csdn net u011006622 article details 56286833 摘要 此文档描述并使用MMA7260QT三轴加速计和低功耗的9S08QG8八位单片机实现求解位置的
  • 卡尔曼滤波算法的深入理解

    以前对于这个算法只会调用 xff0c 并没有深入的理解 现在碰到一个项目 xff0c 没办法只能硬着头皮去理解了 网上看了很多资料 xff0c 感觉写的也一般般 xff0c 现在我讲自己的理解 卡尔曼滤波算法的核心是动态调整权值 用过互补滤
  • win10下删除ubuntu及其引导项

    转载 xff1a https blog csdn net g1027785756 article details 82999451 本文主要针对UEFI和GPT双系统下Ubuntu EFI分区及启动项的删除 1 查看电脑分区信息 电脑分区信
  • VSLAM综述

    传统SLAM算法及相关成果的介绍 根据传感器的分类可将VSLAM大致分为单目SLAM 双目SLAM xff08 立体 xff09 和RGB D SLAM 有根据对图像信息不同的处理方式可分为直接法SLAM和基于特征SLAM 直接法主要有直接
  • 计算机网络-网络分层模型及基本网络协议

    1 网络分层模型 1 1 分层模型图示 1 2 七层模型及各层含义 1 物理层 xff08 Physical Layer xff09 激活 维持 关闭通信端点之间的机械特性 电气特性 功能特性以及过程特性 该层为上层协议提供了一个传输数据的
  • 多进程

    39 39 39 生活中 xff0c 你可能一边听歌 xff0c 一边写作业 xff1b 一边上网 xff0c 一边吃饭 这些都是生活中的多任务场景 电脑也可以执行多任务 xff0c 比如你可以同时打开浏览器上网 xff0c 听音乐 xff