python多线程方法详解

Python多线程方法详解

什么是多线程

多线程是一种利用CPU多核的并发编程方式,它利用CPU在一段时间内分配给不同线程的时间片,来让不同线程交替执行,从而达到并发执行的效果。

Python多线程模块

Python标准库提供了两种主要的多线程模块:_threadthreading。其中,_thread是低级别的模块,主要提供了一些底层的线程操作函数,比如start_new_thread()来创建一个新线程。而threading则是高级别的模块,因此更易用,提供了更多的功能,比如线程锁、事件、信号等等。

使用threading模块创建多线程

假设我们需要在程序中执行两个任务:打印1-5的数字和打印a-e的字母。我们可以使用threading模块来实现多线程。

import threading

def print_numbers():
    for i in range(1, 6):
        print(i)

def print_letters():
    for letter in ['a', 'b', 'c', 'd', 'e']:
        print(letter)

t1 = threading.Thread(target=print_numbers)
t2 = threading.Thread(target=print_letters)

t1.start()
t2.start()

t1.join()
t2.join()

print('Done.')

上述代码中,我们创建了两个线程t1t2,分别去执行print_numbers()print_letters()函数,然后启动两个线程,等待两个线程执行完后再打印Done.

线程同步

多线程协作的时候,由于线程交替执行,可能会导致一些问题,比如线程之间的数据通信、变量共享可能会存在竞争风险。为了避免这种情况,我们需要使用线程同步的机制,比如锁。

import threading

def increment():
    global counter
    for i in range(1000000):
        lock.acquire()
        counter += 1
        lock.release()

def decrement():
    global counter
    for i in range(1000000):
        lock.acquire()
        counter -= 1
        lock.release()

counter = 0
lock = threading.Lock()

t1 = threading.Thread(target=increment)
t2 = threading.Thread(target=decrement)

t1.start()
t2.start()

t1.join()
t2.join()

print('Counter:', counter)

上述代码中,我们创建了一个计数器counter,然后分别开启了两个线程t1t2,分别去调用increment()decrement()函数,它们都会对计数器进行加一和减一的操作,预期的结果应该是counter的值还是0。

要做到这一点,我们需要使用Lock对象来对计数器进行同步,确保同一时刻只有一个线程会对计数器进行修改。

示例1:多线程抓取网页内容

import requests
import threading

def fetch_url(url):
    response = requests.get(url)
    print('Fetched %s with %d bytes.' % (url, len(response.content)))

urls = [
    'http://www.baidu.com',
    'http://www.sina.com',
    'http://www.163.com',
]

threads = []

for url in urls:
    t = threading.Thread(target=fetch_url, args=(url,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

print('Done.')

上述代码中,我们定义了一个fetch_url()函数,用来读取指定URL的内容。然后创建了三个URL,使用三个线程并发执行,最后等待所有线程都结束后再打印Done.

示例2:多线程下载图片

import requests
import threading

def download(url, filename):
    response = requests.get(url)
    with open(filename, 'wb') as f:
        f.write(response.content)

urls = [
    'http://img1.mm131.me/pic/1738/1.jpg',
    'http://img1.mm131.me/pic/1738/2.jpg',
    'http://img1.mm131.me/pic/1738/3.jpg',
]

threads = []

for idx, url in enumerate(urls):
    t = threading.Thread(target=download, args=(url, f'{idx}.jpg'))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

print('Done.')

上述代码中,我们定义了一个download()函数,用来下载指定URL的图片,并保存到本地。然后创建了三个URL,使用三个线程并发下载,最后等待所有线程都结束后再打印Done.

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

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

相关文章

  • 解决tensorflow 与keras 混用之坑

    在使用TensorFlow和Keras混用时,可能会遇到一些问题。以下是解决TensorFlow和Keras混用的完整攻略: 避免重复导入 在使用TensorFlow和Keras混用时,需要避免重复导入。可以使用以下代码避免重复导入: import tensorflow as tf from tensorflow import keras 在上面的代码中,首…

    python 2023年5月14日
    00
  • Python利用subplots_adjust方法解决图表与画布的间距问题

    下面是关于“Python利用subplots_adjust方法解决图表与画布的间距问题”的完整攻略。 1. subplots_adjust方法 在Python中,使用matplotlib库绘制图表时,有时候会出现图表与画布之间的间距问题。这时候,可以使用subplots_adjust()方法调整图表与画布之间的间距。 subplots_adjust()方法的…

    python 2023年5月14日
    00
  • 详解Python如何循环遍历Numpy中的Array

    以下是关于“详解Python如何循环遍历Numpy中的Array”的完整攻略。 NumPy简介 NumPy是Python中的一个开源数学库用于处理大型维数组和阵。它提供了高效的数组和数学函数,可以用于学计算、数据分析、机器习等域。 NumPy的主要特点包括: 多维数组对象ndarray,支持向量化算和广播。 用于对数组快速操作的标准数学函数。 用于写磁盘数据…

    python 2023年5月14日
    00
  • pytorch 如何用cuda处理数据

    PyTorch是一个基于Python的科学计算库,它可以帮助我们高效地创建深度神经网络。CUDA是一种并行计算平台,可以利用NVIDIA GPU的强大计算能力来显著提高深度学习模型训练和推理的速度。在此,我们将详细讲解如何在PyTorch中使用CUDA来处理数据。 为什么使用CUDA 使用CUDA可以充分发挥GPU计算能力的优势。GPU上有大量并行计算单元,…

    python 2023年5月14日
    00
  • miniconda3介绍、安装以及使用教程

    Miniconda是一个轻量级的Anaconda发行版,只包含conda和Python等最基本的组件。Miniconda可以让用户更方便地管理和配置Python环境和库。以下是Miniconda3介绍、安装以及使用教程的完整攻略,包括安装和配置的步骤和示例说明: Miniconda3介绍 Miniconda3是一个轻量级的Anaconda发行版,只包含con…

    python 2023年5月14日
    00
  • 关于Numpy数据类型对象(dtype)使用详解

    Numpy数据类型对象(dtype)使用详解 NumPy是Python中用于科学计算的一个重要的库,它提供了高效的多维数组和与之相关的量。在NumPy中,数据类型对象(dtype)是一个特殊的对象,用于描述数组元素的数据类型。本文将详细讲解NumPy数据类型对象(dtype)的使用方法,包括数据对象的创建、数据类型的属性、数据类型对象的转换等方法。 数据类型…

    python 2023年5月14日
    00
  • Pytorch加载数据集的方式总结及补充

    PyTorch加载数据集的方式总结及补充 PyTorch是一个流行的深度学习框架,它提供了多种加载数据集的方式。本文将总结和补充PyTorch加载数据集的方式,并提供两个示例。 准备工作 在开始之前,需要安装PyTorch库。可以使用以下命令来安装: pip install torch 示例一:使用torchvision加载图像数据集 torchvision…

    python 2023年5月14日
    00
  • 关于Pytorch的MNIST数据集的预处理详解

    以下是关于“关于Pytorch的MNIST数据集的预处理详解”的完整攻略。 背景 MNIST是一个手写数字数据集,包含60,000个训练样本和10,000个测试样本。在Pytorch进行深度学习任务时,需要对MNIST数据集进行预处理。本攻略将介绍如何使用Pytorch对MNIST数据集进行处理。 步骤 步骤一:导入Pytorch和MNIST数据集 在使用P…

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