Python3多线程详解

Python3多线程详解

Python3中的多线程模块是_threadthreading_thread是低级模块,thread是高级模块,对_thread`进行了封装,使得使用更加方便。本文将详细介绍Python3多线程的使用方法。

创建线程

Python中创建线程有两种方式:使用_thread模块和使用threading模块。下面是两种方式的示例:

使用_thread模块

import _thread
import time

def print_time(thread_name, delay):
    count = 0
    while count < 5:
        time.sleep(delay)
        count += 1
        print(f"{thread_name}: {time.ctime(time.time())}")

try:
    _thread.start_new_thread(print_time, ("Thread-1", 1))
    _thread.start_new_thread(print_time, ("Thread-2", 2))
except:
    print("Error: 无法启动线程")

while True:
    pass

在这个示例中,我们使用_thread模块创建了两个线程,分别执行print_time函数。print_time函数会打印当前时间,并在指定的延迟后再次打印。在主线程中,我们使用一个无限循环来保持程序运行,直到手动停止。

使用threading模块

import threading
import time

class MyThread(threading.Thread):
    def __init__(self, thread_name, delay):
        threading.Thread.__init__(self)
        self.thread_name = thread_name
        self.delay = delay

    def run(self):
        count = 0
        while count < 5:
            time.sleep(self.delay)
            count += 1
            print(f"{self.thread_name}: {time.ctime(time.time())}")

try:
    thread1 = MyThread("Thread-1", 1)
    thread2 = MyThread("Thread-2", 2)
    thread1.start()
    thread2.start()
except:
    print("Error: 无法启动线程")

while True:
    pass

在这个示例中,我们使用threading模块创建了两个线程,分别执行MyThread类的run方法。MyThread类继承自threading.Thread类,并重写了run方法。在run方法中,我们执行了与_thread示例中相同的操作。在主线程中,我们使用一个无限循环来保程序运行,直到手动停止。

线程同步

在多线程编程中,线程同步是一个非常重要的问题。Python3中提供了多种方式来实现线程同步,例如使用锁、信号量、事件等。下面是一个使用锁实现线程同步的示例:

import threading
import time

class Counter:
    def __init__(self):
        self.value = 0
        self.lock = threading.Lock()

    def increment(self):
        with self.lock:
            self.value += 1

def worker(counter):
    for i in range(100000):
        counter.increment()

if __name__ == '__main__':
    counter = Counter()
    threads = [threading.Thread(target=worker, args=(counter,)) for i in range(10)]
    for thread in threads:
        thread.start()
    for thread in threads:
        thread.join()
    print(counter.value) # 输出1000000

在这个示例中,我们定义了一个名为Counter的类,该类包含一个value属性和一个lock属性。increment方法使用with语句获取锁,并将value属性加1。在worker函数中,我们创建了10个线程,并让每个线程执行100000次counter.increment()操作。在主线程中,我们等待所有线程执行完毕,并输出counter.value的值。

线程池

在多线程编程中,线程池是一个非常有用的工具,可以避免频繁创建和销毁线程的开销。Python中提供了concurrent.futures模块,可以方便地创建线程池。下面是一个使用线程池的示例:

import concurrent.futures
import time

def worker(delay):
    time.sleep(delay)
    return delay

if __name__ == '__main__':
    with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
        results = executor.map(worker, [1, 2, 3, 4, 5])
        for result in results:
            print(result)

在这个示例中,我们定义了一个名为worker的函数,该函数会在指定的延迟后返回延迟的时间。在主线程中,使用ThreadPoolExecutor创建了一个最大工线程数为2的线程池。我们使用map方法将worker函数应用于输入的值,并在循环中输出结果。

示例说明

下面是一个示例,演示了如何使用多线程和requests库实现并发HTTP请求:

import threading
import requests

def fetch(url):
    response = requests.get(url)
    print(response.text)

threads = [threading.Thread(target=fetch, args=(f'https://www.baidu.com/?page={i}',)) for i in range(10)]
for thread in threads:
    thread.start()
for thread in threads:
    thread.join()

在这个示例中,我们定义了一个名为fetch的函数,它使用requests库来发送HTTP请求并输出响应的文本内容。在主程序中,我们创建了10个线程,并让每个线程执行fetch函数。在主程序中,我们等待所有线程执行完毕。

下面是另一个示例,演示了如何使用多线程和Pillow库实现图片处理:

import threading
from PIL import Image

def process_image(image_path):
    with Image.open(image_path) as image:
        image = image.rotate(90)
        image.save(f'processed_{image_path}')

threads = [threading.Thread(target=process_image, args=(f'image_{i}.jpg',)) for i in range(10)]
for thread in threads:
    thread.start()
for thread in threads:
    thread.join()

在这个示例中,我们定义了一个名为process_image的函数,它使用Pillow库来旋转图片并保存处理后的图片。在主程序中,我们创建了10个线程,并让每个线程执行process_image函数。在主程序中,我们等待所有线程执行完毕。

总结

本文介绍了Python3多线程的使用方法,包括创建线程、线程同步和线程池。在实际应用中,我们需要根据具体情况选择合适的方法以确保程序的正确性和效率。同时,本文提供两个示例说明,演示了如何使用多线程实现并发HTTP请求和图片处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python3多线程详解 - Python技术站

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

相关文章

  • Python 初始化多维数组代码

    Python 是一门功能强大的编程语言,它默认不支持多维数组,但使用第三方库(如 NumPy)可以轻松创建和操作多维数组。下面介绍Python 初始化多维数组代码的完整攻略。 使用列表嵌套 Python 中可以使用列表推导式(List Comprehension)或循环嵌套创建多维数组。 假设要创建一个 shape 为 (3, 4) 的二维数组,可以按如下代…

    python 2023年6月5日
    00
  • python读取文件指定行内容实例讲解

    Python读取文件指定行内容是一个非常实用的技巧,在处理较大的文件时特别有效。下面是完整攻略: 步骤1:打开文件 首先,我们需要打开文件并读取内容。使用Python内置的open()函数可以打开文件并把文件内容读取到一个字符串中。这是一条python代码示例: with open(‘test.txt’, ‘r’) as file: contents = f…

    python 2023年6月5日
    00
  • python集合是否可变总结

    Python中的集合(set)是一种无序且不可重复的数据结构。Python中的集合类型分为可变集合(set)和不可变集合(frozenset),其中可变集合是可以被修改的,而不可变集合则是不可被修改的。那么,Python集合是否可变呢? Python集合是否可变总结 总结如下: 可变集合(set)是可变对象,可以被修改,增加、删除元素。 不可变集合(froz…

    python 2023年5月13日
    00
  • Python中实现常量(Const)功能

    实现常量(Const)功能是一种常见需求,Python中没有内置的原生常量类型,但我们可以使用一些技巧模拟常量的行为。下面是具体实现常量功能的攻略: 使用模块 一个常用的实现常量的技巧是创建一个模块,将需要常量的值定义在模块中,并将它们看作模块的属性,这样在程序中就可以使用该模块的属性来模拟常量。由于模块只会在第一次导入时被解释器加载,因此模块的属性在程序运…

    python 2023年5月30日
    00
  • python操作微信自动发消息的实现(微信聊天机器人)

    准备工作 首先需要先安装itchat库,可以通过pip安装: pip install itchat 接着在微信中扫码登录,代码如下: import itchat itchat.auto_login(hotReload=True) # 运行代码后会出现一个二维码,扫描即可登录微信 实现自动回复功能 为了实现自动回复功能,需要在itchat库的基础上编写一个回调…

    python 2023年5月19日
    00
  • 一些常用的Python爬虫技巧汇总

    一些常用的Python爬虫技巧汇总 本文汇总了一些常用的Python爬虫技巧,包含多线程、代理、浏览器模拟、反反爬虫等内容。 多线程 多线程是爬虫中常用的技巧之一,可以加快数据抓取的速度。 在Python中创建多线程的方法很多,可以使用thread、threading、queue等模块来实现。其中,threading模块是使用最广泛的。 以下是一个简单的多线…

    python 2023年5月14日
    00
  • Python的函数使用示例详解

    Python的函数使用示例详解 函数是Python编程中的重要组成部分,能够让代码更加模块化、可读性更强、可重复使用性更高。本文将详细讲解Python的函数使用示例,以便读者深入了解函数的使用以及代码实现。 函数是什么? 函数是指封装了一定功能的可重复使用的代码块,它可以接收输入参数,执行一定的计算,并返回一个结果。在Python中,函数可以通过def语句来…

    python 2023年5月30日
    00
  • 在Python中对两个一维序列进行离散线性卷积并获得它们重叠的地方

    在Python中,使用NumPy库中的convolve函数可以进行离散线性卷积。要获得两个一维序列的重叠部分,需要将其中一个序列翻转,然后进行卷积操作。卷积结果中的前几个元素即为重叠的部分。 以下是示例代码和说明: 示例1: import numpy as np # 两个一维序列 x = np.array([1, 2, 3, 4]) y = np.array…

    python-answer 2023年3月25日
    00
合作推广
合作推广
分享本页
返回顶部