手把手带你了解python多进程,多线程

手把手带你了解Python多进程、多线程

本文将会介绍Python多进程、多线程的相关知识和使用方法。首先会了解它们的概念和区别,然后会分别介绍它们的具体实现方法,并提供两个示例来帮助理解。

什么是多进程和多线程

多进程和多线程都是为了提高计算机运行效率而产生的技术。

多进程是指同时运行多个独立的进程在不同的CPU中或同一个CPU的不同内核中执行。每个进程都有自己的运行空间和堆栈,它们互不干扰,也不共享变量,进程之间只能通过进程间通信(IPC)来交换数据。每个进程都有自己的独立地址空间,因此每个进程对于同一变量会有自己的一份拷贝,互不影响。

多线程是指在同一进程中同时运行多个线程的技术。每个线程都共享同一进程的运行空间和堆栈,线程之间可以共享变量,也可以通过互斥锁、信号量等同步机制来协调访问共享变量。由于线程之间共享进程的地址空间,因此对于同一变量的访问不同线程之间是共享的。

Python实现多进程和多线程

Python标准库multiprocessingthreading提供了Python实现多进程和多线程的相关模块。

多进程

使用multiprocessing模块实现多进程,需要先导入multiprocessing模块,然后定义一个函数作为进程的执行体,最后创建进程对象并启动进程,示例如下:

import multiprocessing
import time

def worker(num):
    print(f"Starting worker {num}...")
    time.sleep(3)
    print(f"Worker {num} finished.")

if __name__ == '__main__':
    process1 = multiprocessing.Process(target=worker, args=(1,))
    process2 = multiprocessing.Process(target=worker, args=(2,))
    process1.start()
    process2.start()
    process1.join()
    process2.join()

上述代码中,首先定义了一个worker函数作为进程的执行体,该函数有一个参数num,表示进程编号。然后创建了两个进程对象process1process2,分别绑定到worker函数,并传入不同的参数1和2,即进程1和进程2的编号。最后启动两个进程并等待两个进程的结束。

多线程

使用threading模块实现多线程,需要先导入threading模块,然后定义一个函数作为线程的执行体,最后创建线程对象并启动线程,示例如下:

import threading
import time

def worker(num):
    print(f"Starting worker {num}...")
    time.sleep(3)
    print(f"Worker {num} finished.")

if __name__ == '__main__':
    thread1 = threading.Thread(target=worker, args=(1,))
    thread2 = threading.Thread(target=worker, args=(2,))
    thread1.start()
    thread2.start()
    thread1.join()
    thread2.join()

上述代码中,首先定义了一个worker函数作为线程的执行体,该函数有一个参数num,表示线程编号。然后创建了两个线程对象thread1thread2,分别绑定到worker函数,并传入不同的参数1和2,即线程1和线程2的编号。最后启动两个线程并等待两个线程的结束。

示例

使用多进程进行计算密集型任务

下面给出一个使用多进程进行计算密集型任务的例子,计算从1加到1000000的结果,可以将任务分成10个子任务分别在不同的进程中运行,最后汇总得到结果。代码如下:

import multiprocessing

def worker(start, end, result):
    sum = 0
    for i in range(start, end + 1):
        sum += i
    result.put(sum)

if __name__ == '__main__':
    result = multiprocessing.Queue()
    jobs = []
    for i in range(1, 11):
        start = (i - 1) * 100000 + 1
        end = i * 100000
        p = multiprocessing.Process(target=worker, args=(start, end, result))
        jobs.append(p)
        p.start()

    for job in jobs:
        job.join()

    total = 0
    while not result.empty():
        total += result.get()

    print(f"Total: {total}")

上述代码中,首先定义了一个worker函数,它的参数startend表示计算范围的起始和结束值,result表示放置每个子任务结果的队列。在主程序中,创建10个进程分别计算1-100000,100001-200000,…,900001-1000000的结果,最后从队列中获取每个进程的结果并汇总得到总结果。

使用多线程进行IO密集型任务

下面给出一个使用多线程进行IO密集型任务的例子,模拟爬取3个网站的内容,可以将每个网站分别放到不同的线程中爬取,在执行过程中可以看到不同的线程交替运行。代码如下:

import threading
import requests
import time

def crawler(url):
    print(f"Start crawling {url}...")
    response = requests.get(url)
    print(f"Crawling {url} finished.")
    return response

if __name__ == '__main__':
    urls = ["https://www.baidu.com", "https://www.sina.com", "https://www.qq.com"]
    threads = []
    for url in urls:
        t = threading.Thread(target=crawler, args=(url,))
        threads.append(t)
        t.start()

    for t in threads:
        t.join()

上述代码中,首先定义了一个crawler函数,它的参数url表示需要爬取的网站地址。在主程序中,创建3个线程分别爬取三个网站,通过观察输出可以看到不同的线程交替运行,以此提高程序的效率。

总结

本文介绍了Python多进程、多线程的概念和实现方法,并通过示例演示了使用多进程和多线程进行计算密集型和IO密集型任务的方法。在使用多进程和多线程的过程中,需要注意多进程之间的内存共享访问和多线程之间的资源互斥访问,尤其注意进程池和线程池在平衡性、性能、控制进程或线程数量等方面的特点和不同。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:手把手带你了解python多进程,多线程 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • JS前端并发多个相同的请求控制为只发一个请求方式

    JS前端并发多个相同的请求时,由于后端可能要对请求做一些处理和计算,重复的请求将会对系统造成一定的负担和影响响应速度。因此,需要控制多个相同请求只发送一个请求的方式,以提高页面性能和后端服务的质量。下面是可能的解决方案: 1. 建立请求队列 可以通过建立请求队列,将所有重复的请求都放到队列中,然后只发出队列里的第一个请求。接着,在请求的回调中,从队列中移除发…

    多线程 2023年5月16日
    00
  • 分享Java多线程实现的四种方式

    让我来为您详细讲解“分享Java多线程实现的四种方式”的完整攻略。 1. 使用继承Thread类方式实现多线程 这种方式是通过继承Thread类并重写它的run()方法来实现多线程。示例如下: public class MyThread extends Thread { @Override public void run() { // 线程要执行的代码 } …

    多线程 2023年5月17日
    00
  • Java多线程之Future设计模式

    下面是详细的讲解“Java多线程之Future设计模式”的完整攻略。 什么是Future设计模式 Future设计模式是一种Java多线程技术,它可以在一个线程中异步执行某些任务,然后在未来的某个时间点获取任务的结果。通常情况下,我们会使用Future设计模式来加快应用程序的响应速度,因为它可以将应用程序的某些任务异步化,使得这些任务的执行速度不会影响其他任…

    多线程 2023年5月16日
    00
  • Java并发编程示例(六):等待线程执行终止

    这里是关于“Java并发编程示例(六):等待线程执行终止”的完整攻略。 标题 Java并发编程示例(六):等待线程执行终止 简介 在Java并发编程中,常常需要等待一个线程或多个线程的执行终止,才能接着执行下一步的操作。这篇文章将介绍如何等待线程执行终止的几种方法,以及使用这些方法的示例。 阻塞等待线程执行终止的方法 使用Thread.join()方法 在主…

    多线程 2023年5月16日
    00
  • jdk自带线程池实例详解

    JDK自带线程池实例详解 线程池介绍 在应用程序开发中,使用线程是很常见的。当一个程序被执行时,它会生成一个主线程,这个主线程可以并行运行多个程序段。但如果程序中包含多个任务需要同时运行时,如果每个任务都创建自己的线程,这将会导致线程的大量创建和销毁,极度浪费资源。而线程池的出现解决了这个问题,它将多个任务合并在一起,让它们共享一个线程池中的线程完成任务。 …

    多线程 2023年5月16日
    00
  • 15个高级Java多线程面试题及回答

    15个高级Java多线程面试题及回答 本文将详细介绍 15 个高级 Java 多线程面试题及回答,以下是题目列表: 在 Java 中,什么是线程死锁,如何避免死锁? 什么是线程池,在多线程编程中,为什么要使用线程池? 请解释 synchronized 和 volatile 关键字的用途。 从编程的角度来看,什么是竞态条件? 如何在 Java 中实现可重入锁?…

    多线程 2023年5月16日
    00
  • 一个可交互的并发ping检测脚本

    针对“一个可交互的并发ping检测脚本”的完整攻略,我会从以下几个方面进行详细讲解。 1. 相关技术准备 在开始编写脚本之前,需要了解一些相关技术和工具,如: Python编程语言 并发编程 ping命令(Windows和Linux系统都支持) ping命令的Python封装库 2. 脚本设计与实现 2.1 设计思路 可以采用多线程的方式实现并发的ping检…

    多线程 2023年5月16日
    00
  • haskell实现多线程服务器实例代码

    为了实现多线程服务器,我们需要使用Haskell提供的多线程编程库。常用的有两个:Control.Concurrent库和forkIO函数。其中Control.Concurrent库包含了多种多线程机制,例如MVars和STM,而forkIO函数则是一种直接使用线程的方式。在这里,我们将使用forkIO函数来实现多线程服务器。下面是详细的步骤: 步骤一:导入…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部