聊聊python多线程与多进程

简介: 为什么要使用多进程与多线程呢?因为我们如果按照流程一步步执行任务实在是太慢了,假如一个任务就是10秒,两个任务就是20秒,那100个任务呢?况且cpu这么贵,时间长了就是浪费生命啊!一个任务比喻成一个人,别个做高铁,你做绿皮火车,可想而知!接下来我们先看个例子:

为什么要使用多进程与多线程呢?

因为我们如果按照流程一步步执行任务实在是太慢了,假如一个任务就是10秒,两个任务就是20秒,那100个任务呢?况且cpu这么贵,时间长了就是浪费生命啊!一个任务比喻成一个人,别个做高铁,你做绿皮火车,可想而知!接下来我们先看个例子:

from random import randint
from time import sleep,time
def download_task(file_name):
    print('begin download file %s' %file_name)
    spend_time=randint(5,10)
    sleep(spend_time)
    print('%s finish download spend time %d sencond' %(file_name,spend_time))
def main():
    start=time()
    dowload_task('1.txt')
    dowload_task('2.txt')
    end=time()
    print('total time %.2f' %(end-start))
if __name__=='__main__':
    main()

执行结果如下图:

都花费13s了。。。。。。。。,大无语好吧!

多进程

from multiprocessing import Process
from random import randint
from os import getpid
from time import time,sleep
def download_task(file_name):
    print('begin download file %s' %file_name)
    
    spend_time=randint(5,10)
    sleep(spend_time)
    print('%s finish download spend time %d sencond' %(file_name,spend_time))
def main():
    start=time()
    dowload_task('1.txt')
    dowload_task('2.txt')
    end=time()
    print('total time %.2f' %(end-start))
if __name__=='__main__':
    main()

执行结果如下:

上面的代码就是通过Process类创建的进程对象,通过target参数传递一个需执行的函数,args是要传入的传输,它是一个组。后面通过start()来启动函数,join()等待函数结束,我们可以从出时间减少了很多,最后的时间不在是两个任务依次执行的综合了!

多线程

# /usr/bin/python3
from random import randint
from threading import Thread
from time import time, sleep
from os import getpid
def dowload_task(file_name):
    print("开始下载%s" % file_name)
    print("进程id %d" % getpid())
    spend_time = randint(5, 10)
    sleep(spend_time)
    print("%s下载完成,耗费%ds" % (file_name, spend_time))
def main():
    start = time()
    p1 = Thread(target=dowload_task, args=("1.txt",))
    p1.start()
    p2 = Thread(target=dowload_task, args=("2.txt",))
    p2.start()
    p1.join()
    p2.join()
    end = time()
    print("总共花费%ss" % (end - start))
if __name__ == "__main__":
    main()

执行结果

用class方式

# /usr/bin/python3
from random import randint
from threading import Thread
from time import time, sleep
from os import getpid
class Down_task(Thread):
    def __init__(self, file_name):
        super().__init__()
        self._file_name = file_name
    def run(self):
        print("开始下载%s" % self._file_name)
        print("进程id %d" % getpid())
        spend_time = randint(5, 10)
        sleep(spend_time)
        print("%s下载完成,耗费%ds" % (self._file_name, spend_time))
def main():
    start = time()
    p1 = Down_task(
        "1.txt",
    )
    p1.start()
    p2 = Down_task(
        "2.txt",
    )
    p2.start()
    p1.join()
    p2.join()
    end = time()
    print("总共花费%ss" % (end - start))
if __name__ == "__main__":
    main()

执行结果:

问题:

  1. 那你们知道进程与线程区别吗?
  2. 什么时候用线程什么时候用进程?
  3. 线程在做计算任务时,需要注意什么呢?
相关文章
|
13天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
18天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
15天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
24 1
|
20天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
36 2
|
21天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
25天前
|
Java Unix 调度
python多线程!
本文介绍了线程的基本概念、多线程技术、线程的创建与管理、线程间的通信与同步机制,以及线程池和队列模块的使用。文章详细讲解了如何使用 `_thread` 和 `threading` 模块创建和管理线程,介绍了线程锁 `Lock` 的作用和使用方法,解决了多线程环境下的数据共享问题。此外,还介绍了 `Timer` 定时器和 `ThreadPoolExecutor` 线程池的使用,最后通过一个具体的案例展示了如何使用多线程爬取电影票房数据。文章还对比了进程和线程的优缺点,并讨论了计算密集型和IO密集型任务的适用场景。
47 4
|
25天前
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
51 1
|
7天前
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
40 0
|
1月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
48 1
C++ 多线程之初识多线程
|
30天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
20 3
下一篇
无影云桌面