百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

python多进程与多线程(python多进程多线程区别)

citgpt 2024-09-09 02:16 20 浏览 0 评论

多任务

python多任务可以使用多进程或多线程完成。那什么是多任务了?如百度网盘下载东西,我们可以同时下载多个东西,即多个任务同时进行。

多任务是指在同一时间内执行多个任务

python多进程与多线程(python多进程多线程区别)

多任务的表现形式

1. 并发

在一段时间内交替去执行多个任务。

例子:对于单核cpu处理多任务,操作系统轮流让各个任务交替执行。

2. 并行

在一段时间内真正的同时一起执行多个任务。

例子:对于多核cpu处理多任务,操作系统会给cpu的每个内核安排一个执行的任务,多个内核是真正的一起同时执行多个任务。这里需要注意多核cpu是并行的执行多任务,始终有多个任务一起执行。

什么是进程?

进程(Process)是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位,通俗理解:一个正在运行的程序就是一个进程。例如:正在运行的qq,微信等他们都是一个进程。

多进程

多进程的作用

图中是一个非常简单的程序,一旦运行hello.py这个程序,按照代码的执行顺序,func_a函数执行完毕后才能执行func_b函数。如果可以让func_a和func_b同时运行,显然执行hello.py这个程序的效率会大大提升。

使用多进程让这两个函数同时执行

多进程代码实现

1. 导入进程包

import multiprocessing

2. 通过进程类创建进程对象

进程对象 = multiprocessing.Process(target=任务名)

3. 启动进程执行任务

进程对象.start()

如下使用单任务执行,需要花费6秒的时间

from time import sleep
import time
start = time.time()
def sing():
    for i in range(3):
        print("唱歌...")
        sleep(1)
def dance():
    for i in range(3):
        print("跳舞...")
        sleep(1)
if __name__ == '__main__':
    sing()
    dance()
    end = time.time()
    print('程序运行时间:',end-start)

使用多进程,sing和dance两个函数是同时执行的,花费的时间少一半

#1.导包
import multiprocessing
from time import sleep
import time
start = time.time()
def sing():
    for i in range(3):
        print("唱歌...")
        sleep(1)
def dance():
    for i in range(3):
        print("跳舞...")
        sleep(1)
def main():
    #2.通过进程类创建进程对象
    sing_process = multiprocessing.Process(target=sing)
    dance_process = multiprocessing.Process(target=dance)
    #3.启动进程
    sing_process.start()
    dance_process.start()
    
if __name__ == '__main__':
    main()

获取进程编号

当程序中进程的数量越来越多时,如果没有办法区分主进程和子进程还有不同的子进程,那么就无法进行有效的进程管理,为了方便管理实际上每个进程都是有自己编号的

  • 获取当前进程编号 os.getpid()
  • 获取当前父进程编号 os.getppid()

当这个程序运行起来的时候会有个主进程,然后启动了两个子进程,这两个子进程的父进程就是程序的主进程启动的。

#1.导包
import multiprocessing
from time import sleep
import time, os
start = time.time()
def sing():
    print("唱歌进程的pid:",os.getpid(),"父进程pid为:",os.getppid())
    for i in range(3):
        print("唱歌...")
        sleep(1)
def dance():
    print("跳舞进程的pid:",os.getpid(),"父进程pid为:",os.getppid())
    for i in range(3):
        print("跳舞...")
        sleep(1)
def main():
    #2.通过进程类创建2个进程对象
    sing_process = multiprocessing.Process(target=sing)
    dance_process = multiprocessing.Process(target=dance)
    #3.启动进程
    sing_process.start()
    dance_process.start()
    
if __name__ == '__main__':
    print("主进程pid为:",os.getpid())
    main()

多线程

进程是分配资源的最小单位,一旦创建一个进程就会分配一定的资源,就像跟两个人聊QQ就需要打开两个QQ软件一样是比较浪费资源的。

线程是程序执行的最小单位,实际上进程只负责分配资源,而利用这些资源执行程序的是线程,也就说进程是线程的容器,一个进程中最少有一个线程来负责执行程序.同时线程自己不拥有系统资源,只需要一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。这就像通过一个QQ软件(一个进程)打开两个窗口(两个线程)跟两个人聊天一样,实现多任务的同时也节省了资源.

多线程的作用

多进程相当于我和多个人聊天需要同时打开多个qq,而多线程则相当于我只打开一个qq但是我在qq里面开启多个窗口

多线程代码实现

代码实现方式和多进程基本一致

1. 导入线程模块

import threading

2. 通过线程类创建线程对象

线程对象 = threading.Thread(target=任务名)

3. 启动线程执行任务

线程对象.start()

多线程实现案例

#1.导包
import threading
from time import sleep
import time
start = time.time()
def sing():
    for i in range(3):
        print("唱歌...")
        sleep(1)
def dance():
    for i in range(3):
        print("跳舞...")
        sleep(1)
def main():
    #2.通过线程类创建线程对象
    sing_process = threading.Thread(target=sing)
    dance_process = threading.Thread(target=dance)
    #3.启动线程
    sing_process.start()
    dance_process.start()
    
if __name__ == '__main__':
    main()

?

ps:主线程会等待所有子线程结束后才结束,如果想当主线程关闭的时候,所以子线程也结束,那么可以把设置守护主线程

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: