Python多线程与多进程相关知识总结

Python多线程与多进程相关知识总结

多线程

多线程是指在同一进程中,多个线程并行执行不同的任务。Python提供了线程模块threading来处理多线程相关问题。线程模块允许开发商在单一进程内创建多个线程,从而最大限度地利用CPU资源。下面是一个简单的创建线程的示例代码:

import threading

def worker(num):
    """线程的工作函数"""
    print('Worker %s is running' % num)

if __name__ == '__main__':
    threads = []
    for i in range(5):
        t = threading.Thread(target=worker, args=(i,))
        threads.append(t)
        t.start()
    for t in threads:
        t.join()

该示例中,创建了5个线程,每个线程都调用了worker函数执行任务。运行结果如下:

Worker 0 is running
Worker 1 is running
Worker 2 is running
Worker 3 is running
Worker 4 is running

需要注意的是,Python的多线程虽然可以在一定程度上提高程序运行效率,但由于GIL(Global Interpreter Lock,全局解释器锁)的存在,多线程的效率提升并不明显。因此,在需要大量计算密集型的任务时,建议使用多进程。

多进程

多进程指的是在不同的进程中并行执行不同的任务。Python提供了multiprocessing模块来处理多进程相关问题。multiprocessing模块是Python标准库中的模块,旨在提供一个能够与线程模块兼容的进程模块。下面是一个简单的创建进程的示例代码:

import multiprocessing

def worker(num):
    """进程的工作函数"""
    print('Worker %s is running' % num)

if __name__ == '__main__':
    processes = []
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        processes.append(p)
        p.start()
    for p in processes:
        p.join()

该示例中,创建了5个进程,每个进程都调用了worker函数执行任务。运行结果如下:

Worker 0 is running
Worker 1 is running
Worker 2 is running
Worker 3 is running
Worker 4 is running

需要注意的是,在多进程中,由于每个进程都有独立的内存空间,因此需要使用进程通信来进行数据的交互。常用的进程通信方式有管道(Pipe)、消息队列(Queue)和共享内存(Value、Array)等。

示例1:使用进程池处理大量计算密集型任务

在需要大量计算密集型任务时,使用进程可以获得更好的性能提升。下面是一个示例代码:

import multiprocessing
import time

def calc(num):
    """模拟一个计算密集型任务"""
    res = 0
    for i in range(100000):
        res += i * i
    return res

if __name__ == '__main__':
    start_time = time.time()
    pool = multiprocessing.Pool(processes=4) # 创建进程池,包含4个进程
    results = pool.map(calc, range(100)) # 对0~99之间的数进行计算
    pool.close()
    pool.join()
    print('Time costs:', time.time() - start_time)

该示例中,使用进程池调用calc函数对0~99之间的数进行计算。由于使用了进程池,可以看到程序运行速度得到了极大的提升。

示例2:使用多线程进行网络爬取

网络爬取是一个典型的IO密集型任务,使用多线程可以充分利用CPU资源,提高程序运行效率。下面是一个使用多线程进行网络爬取的示例代码:

import threading
import requests
import time

def fetch(url):
    """爬取指定url的内容"""
    res = requests.get(url)
    print('Fetch', url, 'done')

if __name__ == '__main__':
    urls = ['https://www.baidu.com', 'https://www.google.com', 'https://www.bing.com']
    threads = []
    start_time = time.time()
    for url in urls:
        t = threading.Thread(target=fetch, args=(url,))
        threads.append(t)
        t.start()
    for t in threads:
        t.join()
    print('Time costs:', time.time() - start_time)

该示例中,使用多线程爬取指定url的内容。由于使用了多线程,可以看到程序运行速度得到了显著的提升。

以上就是Python多进程与多线程相关知识的总结,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多线程与多进程相关知识总结 - Python技术站

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

相关文章

  • Python多线程编程之threading模块详解

    Python多线程编程之threading模块详解 什么是多线程编程 多线程编程是指在一个程序进程中同时运行多个不同的线程,这些线程可能会共享程序的内存空间和其他资源。在多线程编程中,有时需要将某一些任务放在不同的线程中运行,从而带来以下好处: 使程序可以同时执行多个任务,提高程序效率; 能够更加充分地利用计算机的CPU和其他资源; 在某些情况下,使用多线程…

    多线程 2023年5月16日
    00
  • C语言编程中借助pthreads库进行多线程编程的示例

    以下是C语言多线程编程的攻略: 1. 简介 多线程编程是指在一个程序中同时运行多个线程以达到提高程序效率的目的。在C语言中,pthreads库(POSIX Threads)提供了多线程编程的支持。使用pthreads库可以在C语言程序中创建多个线程,每个线程执行各自的任务,这些线程共享进程的资源,如内存空间、文件句柄等。下面将介绍如何使用pthreads库进…

    多线程 2023年5月17日
    00
  • shell脚本定时统计Nginx下access.log的PV并发送给API保存到数据库

    这里给出步骤如下: 步骤一:编写PV统计脚本 为了实现PV统计,我们需要编写脚本来扫描Nginx的access.log,统计PV并输出结果到一个文件中。假设我们将PV统计脚本命名为count_pv.sh,以下是一个示例代码: #!/bin/bash # 定义需要统计的日志文件路径 LOG_PATH="/var/log/nginx/access.lo…

    多线程 2023年5月17日
    00
  • 分析Go语言中CSP并发模型与Goroutine的基本使用

    分析Go语言中CSP并发模型与Goroutine的基本使用攻略 什么是CSP并发模型 CSP (Communicating Sequential Processes),即通信顺序进程,是一种并发计算模型。这种模型通过在进程之间传递消息来进行通信,而不是共享内存。在Go语言中,CSP并发模型采用channel(通道)来实现进程间通信(IPC)。 Gorouti…

    多线程 2023年5月17日
    00
  • php swoole多进程/多线程用法示例【基于php7nts版】

    下面就是PHP Swoole多进程/多线程用法示例攻略: PHP Swoole多进程/多线程用法示例 什么是PHP Swoole? Swoole是一个PHP扩展,提供了基于事件驱动的异步、多线程服务器。它可以替代PHP-FPM,并且可以作为TCP/UDP/WebSocket服务器和客户端使用。 多进程/多线程用法示例 以下代码示例用法均基于PHP7nts版。…

    多线程 2023年5月17日
    00
  • java并发数据包Exchanger线程间的数据交换器

    Java并发数据包Exchanger是一个线程间协作的工具,它可以在两个线程之间交换数据。Exchanger能够提供更强大的数据交换功能,它在两个线程之间允许数据交换过程是同步的,也就是说,一个线程在Exchanger调用exchange方法时会一直等待直到另外一个线程也调用exchange方法后才会继续进行,否则会一直阻塞。 Exchanger通过一对线程…

    多线程 2023年5月17日
    00
  • 基于Java回顾之多线程详解

    基于Java回顾之多线程详解 Java作为一门支持多线程编程的语言,多线程编程已经成为JVM生态中极为重要的编程技巧之一。Java提供了许多多线程编程的API及相关库,可以轻松实现多线程程序。本文将从以下几个方面来详细讲解Java多线程编程的相关知识: 多线程基础概念 多线程编程的五种方式 多线程的同步与锁机制 Java 线程池 多线程基础概念 在Java多…

    多线程 2023年5月17日
    00
  • 实例代码讲解JAVA多线程

    下面我将详细讲解“实例代码讲解JAVA多线程”的完整攻略,包含如下内容: 一、多线程基础知识 1. 线程的概念及创建 线程是指在单个程序中同时运行的多个执行单元,每个线程都有独立的执行路径。Java中通过继承Thread类或实现Runnable接口的方式创建线程,具体代码实例如下: public class MyThread extends Thread {…

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