Python多线程处理实例详解【单进程/多进程】

Python多线程处理实例详解【单进程/多进程】

什么是多线程?

  • 在操作系统中,进程是分配资源的基本单位,而线程则是进程中执行代码的单位。
  • 一个进程中可以包含多个线程,每个线程共享进程的内存和资源,但是每个线程也有各自的执行堆栈和局部变量,从而实现并发执行。

Python中的多线程实现

  • Python中使用threading模块实现多线程。
  • 使用Thread类可以创建一个线程对象,执行这个线程对象的start()方法可以创建并开始一个线程。

下面是创建一个简单线程的示例:

import threading

def print_time(thread_name, counter, delay):
    while counter > 0:
        print("%s: %s" % (thread_name, time.ctime(time.time())))
        time.sleep(delay)
        counter -= 1

thread1 = threading.Thread(target=print_time, args=("Thread-1", 5, 1))
thread2 = threading.Thread(target=print_time, args=("Thread-2", 5, 2))

thread1.start()
thread2.start()

# 等待线程结束
thread1.join()
thread2.join()

print("Exit main thread")

上述代码创建了两个线程,分别是Thread-1Thread-2,每个线程都会执行print_time函数,并且传入不同的参数。在创建线程后,分别通过start()方法启动线程,最后通过join()方法等待线程结束。

线程的同步和通信

在多线程编程中,为了防止线程之间对同一共享资源的争用而出现的问题,通常会使用线程同步和线程通信方式。

线程同步

  • 线程同步是指在多个线程间,按照一定顺序对共享资源的访问,以避免数据不一致或者发生冲突等问题。
  • 在Python中,可以使用LockRLockSemaphore等锁机制来实现线程同步。

下面是一个简单的使用Lock实现线程同步的示例:

import threading

count = 0
lock = threading.Lock()

def add_count():
    global count, lock

    for i in range(100000):
        lock.acquire()
        count += 1
        lock.release()

thread1 = threading.Thread(target=add_count)
thread2 = threading.Thread(target=add_count)

thread1.start()
thread2.start()

# 等待线程结束
thread1.join()
thread2.join()

print("Final count: %s" % count)

在上述示例中,count是共享资源,我们使用Lock来同步两个线程对count的访问,保证了count的递增过程是安全的。

线程通信

  • 线程通信是指在多个线程间,通过同步的方式来传递信息,从而实现线程之间的协调和同步。
  • 在Python中,可以使用queue队列实现线程通信。

下面是一个简单的使用queue实现线程通信的示例:

import queue
import threading
import time

queue1 = queue.Queue(10)

def produce():
    for i in range(10):
        queue1.put(i)
        print("produce %s" % i)
        time.sleep(1)

def consume():
    while True:
        item = queue1.get()
        if item is None:
            break
        print("consume %s" % item)

thread1 = threading.Thread(target=produce)
thread2 = threading.Thread(target=consume)

thread1.start()
thread2.start()

thread1.join()
queue1.put(None)
thread2.join()

在上述示例中,我们创建了一个队列queue1,生产线程produce向队列中添加数据,消费线程consume从队列中获取数据并输出,通过这种方式实现了多线程之间的通信和同步。

多进程处理

多进程是指在操作系统中并行执行多个进程的方式,同一个程序可以通过多个进程来同时执行多个任务。

Python中的多进程实现

在Python中,我们可以使用multiprocessing模块实现多进程处理。

下面是一个简单的使用Process类创建多进程的示例:

import multiprocessing
import time

def worker():
    print("%s start" % multiprocessing.current_process().name)
    time.sleep(2)
    print("%s end" % multiprocessing.current_process().name)

if __name__ == '__main__':
    process1 = multiprocessing.Process(name='process1', target=worker)
    process2 = multiprocessing.Process(name='process2', target=worker)

    process1.start()
    process2.start()

    process1.join()
    process2.join()

    print("All subprocess(es) have finished")

在上述示例中,我们通过创建Process类的对象,使用start()方法启动多个进程,最后使用join()方法等待进程结束。

多进程池

在多进程处理中,由于进程的创建和销毁都会消耗额外的资源,因此创建多个进程比较浪费资源,为此我们可以使用多进程池。

使用多进程池可以有效地减少进程的创建和销毁次数,节省了系统资源,提高了进程的执行效率。

下面是一个简单的使用Pool类创建多进程池的示例:

import multiprocessing
import time

def worker(n):
    print("%s start with %s" % (multiprocessing.current_process().name, n))
    time.sleep(2)
    print("%s end with %s" % (multiprocessing.current_process().name, n))
    return n*2

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=2)

    results = []
    for i in range(5):
        results.append(pool.apply_async(worker, (i,)))

    pool.close()
    pool.join()

    for r in results:
        print(r.get())

在上述示例中,我们通过创建Pool类的对象,使用apply_async()方法将多个任务交给进程池执行,并使用get()方法获取任务的结果。

总结

本文介绍了Python中多线程和多进程的基本概念和实现方式,并给出了涉及线程同步、线程通信和多进程池的示例代码。同时,多线程和多进程处理在Python中都得到了良好的支持,你可以根据实际需要选择适合的方式来实现多任务处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多线程处理实例详解【单进程/多进程】 - Python技术站

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

相关文章

  • Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析

    Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析 本文将介绍如何使用Python爬虫爬取去哪儿网站上的旅游景点攻略,并使用可视化工具对数据进行分析和展示。本文将分为以下几个部分: 爬取去哪儿网站上的旅游景点攻略数据 数据清洗和处理 使用可视化工具对数据进行分析和展示 爬取去哪儿网站上的旅游景点攻略数据 首先,我们需要使用Python爬虫爬取去哪…

    python 2023年5月14日
    00
  • Python实现直播推流效果

    针对这个问题,我将提供一个包括以下步骤的完整攻略: 安装必要的Python库 配置视频采集设备 生成直播地址 实现视频采集和编码 实现直播推流 下面,我将对每个步骤进行详细说明。 1. 安装必要的Python库 在Python中实现直播推流功能,需要使用到一些特定的库。其中,最主要的是FFmpeg和librtmp。你可以使用以下命令来安装这些库: sudo …

    python 2023年5月19日
    00
  • 对Python3.x版本print函数左右对齐详解

    对Python3.x版本print函数左右对齐详解 在Python3.x版本中,print函数有多种对齐方式,可以对字符串进行左对齐、右对齐和居中对齐。下面逐一介绍这三种对齐方式以及如何使用它们。 左对齐 采用左对齐方式可以将字符串左对齐,并在字符串右侧填充空格来实现对齐。左对齐采用“<”进行标识。 string = ‘Python’ print(‘{…

    python 2023年6月5日
    00
  • 如何把python项目部署到linux服务器

    部署Python项目到Linux服务器的过程可以分成以下几个步骤: 准备Linux服务器环境: 在Linux服务器上安装Python和所需依赖包,并设置好相应的环境变量,以便后续能够正常运行项目。 准备Python项目文件: 将Python项目文件打包成压缩文件(通常使用.tar.gz或.zip格式),并上传到Linux服务器上。 解压项目文件: 在Linu…

    python 2023年6月3日
    00
  • Python基础教程学习笔记 第二章 列表和元组

    Python基础教程学习笔记第二章列表和元组 本文将详细讲解Python基础教程第二章列表和元组的内容,包括列表和元组的定义、基本操作、高级操作等。 列表 列表是Python中最常用的数据类型之一,它是一个有序的、可变的序列,可以存储任意数量、任意类型的数据。列表使用方括号[]来表示,其中的元素逗号分隔。下面是一个简单的列表示例: my_list = [1,…

    python 2023年5月13日
    00
  • 春招面试,看这110道Python面试题就够了(强烈推荐)

    这篇文章是一份Python面试题的攻略指南,主要包括以下几个部分: 背景介绍:文章介绍了为什么需要一份Python面试题攻略,以及这篇文章所涵盖的主要内容。 面试题分类:文章将110道Python面试题分成了7个分类,便于读者查找所需。 解答技巧:文章针对每一个分类的面试题,解答了如何正确理解问题,以及如何有针对性地回答问题。 示例说明:文章还通过两个具体的…

    python 2023年5月13日
    00
  • Python 日志管理模块Loguru的用法小结

    一、Loguru是什么?Loguru是一个Python日志管理模块,方便易用,支持多线程环境下的日志记录。它提供了直观的界面,让您对日志进行高度的自定义,支持级别、回滚、异步记录和可自定义格式输出等功能。 二、安装Loguru模块通过pip安装: pip install loguru 三、Loguru的应用举例假设我们希望记录一个操作日志,并将日志分成不同级…

    python 2023年6月3日
    00
  • python发送告警邮件脚本

    Python发送告警邮件脚本攻略 一、背景知识 在日常工作中,我们经常需要监控服务器状态或程序运行情况。当出现异常情况时,及时发送告警邮件可以帮助我们快速定位和解决问题。 Python作为一门流行的编程语言,有丰富的第三方库可以用于发送邮件。其中,标准库的smtplib模块提供了SMTP(Simple Mail Transfer Protocol)客户端的实…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部