栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

使用Python进行多任务

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Python进行多任务

多任务的执行:
  • 并发:在一段时间内交替执行
  • 并行:同时执行,真正意义上的同时

在python里实现多任务 使用进程来实现,进程是实现多任务的一种方式

  • 进程:一个正在执行的软件或程序,是os进行资源分配和调度运行的基本单位。指分配资源,不会真的执行,真正执行的是线程
  • 线程:每个进程下一定有一个主线程,来执行代码

一个进程就好像一个公司,不同公司提供不同的资源,干活的是员工,也就是线程

import multiprocessing
import time
def dance():
    for i in range(5):
        print('dancing')
        time.sleep(0.2)
def sing():
    for i in range(5):
        print('singing')
        time.sleep(0.2)
if __name__=='__main__':
    # 创建子进程对象 target:指定执行目标任务 name:进程名,不设置就是Process-1,group:进程组,目前不需要
    dance_process = multiprocessing.Process(target = dance)
    sing_process = multiprocessing.Process(target = sing)
    # 启动
    dance_process.start()
    sing_process.start()
进程执行带有参数的任务
  • args:以元组方式进行传参,只有一个的时候需要多加一个’,'不然会被说int不可以循环
  • kwargs:以字典方式进行传惨
import multiprocessing
import time


def dance(num):
    for i in range(num):
        print('dancing')
        time.sleep(0.2)


def sing(num):
    for i in range(num):
        print('singing')
        time.sleep(0.2)


if __name__=='__main__':
    # 创建子进程对象 target:指定执行目标任务 name:进程名,不设置就是Process-1,group:进程组,目前不需要
    dance_process = multiprocessing.Process(target=dance, args=(3,))
    sing_process = multiprocessing.Process(target=sing, kwargs={'num': 5})
    # 启动
    dance_process.start()
    sing_process.start()
获取进程编号
  • os.getpid() 获取当前进程编号
  • os.getppid() 获取当前进程的父进程编号
import multiprocessing
import time
import os


def dance(num):
    print("dance's father >>>%d" % os.getppid())
    for i in range(num):
        print('dancing')
        time.sleep(0.2)


def sing(num):
    print("sing's father >>>%d" % os.getppid())
    for i in range(num):
        print('singing')
        time.sleep(0.2)


if __name__=='__main__':
    # 创建子进程对象 target:指定执行目标任务 name:进程名,不设置就是Process-1,group:进程组,目前不需要
    print("main>>>%d" % os.getpid())
    dance_process = multiprocessing.Process(target=dance, args=(2,))
    sing_process = multiprocessing.Process(target=sing, kwargs={'num': 2})
    # 启动
    dance_process.start()
    sing_process.start()
进程之间不共享全局变量
  • 创建子进程是把主进程的资源进行拷贝,产生了一个新的进程,所以主进程、子进程相互独立,互不打扰
import multiprocessing
import time
# 定义全局变量
my_list = []


def write_data():
    for i in range(5):
        my_list.append(i)
        print("add:", i)
    print('write:', my_list)


def read_data():
    print('read:', my_list)


if __name__ == '__main__':
    # 创建写进程
    write_process = multiprocessing.Process(target=write_data)
    # 创建读进程
    read_process = multiprocessing.Process(target=read_data)
    write_process.start()
    time.sleep(1)
    read_process.start()
主进程和子进程的结束顺序
  • 主进程:微信
  • 子进程:一些聊天窗口
    当直接结束主进程的时候,首先结束子进程,再结束主进程

以下是代码执行结果,即使打印了主进程结束,但还是没结束,主进程在等待子进程执行

import multiprocessing
import time

def work():
    for i in range(10):
        print('working...')
        time.sleep(0.2)

if __name__ == '__main__':
    work_process = multiprocessing.Process(target=work)
    work_process.start()
    time.sleep(1)
    print('main process is over')
设置守护主进程/手动销毁子进程
  • 当把一个子进程设置为守护主进程,那么主进程不等子进程。当执行完以后,直接销毁子进程,不在执行子进程
def work():
    for i in range(10):
        print('working...')
        time.sleep(0.2)

if __name__ == '__main__':
    work_process = multiprocessing.Process(target=work)
    # 设置为 守护主进程
    work_process.daemon = True
    
    work_process.start()
    time.sleep(1)
    print('main process is over')
import multiprocessing
import time

def work():
    for i in range(10):
        print('working...')
        time.sleep(0.2)

if __name__ == '__main__':
    work_process = multiprocessing.Process(target=work)
    # 设置为 守护主进程
    # work_process.daemon = True

    work_process.start()
    time.sleep(1)
    # 手动销毁
    work_process.terminate()
    print('main process is over')
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960708.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号