python多线程方法详解

yizhihongxing

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日

相关文章

  • python 存储变量的几种方法(推荐)

    在Python中,存储变量是编程中的一个基本操作。Python提供了多种存储变量的方法,本文将详细讲解Python存储变量的几种方法,并推荐使用的方法。 存储变量的几种方法 Python存储变量的几种方法包括: 方法1:使用变量名存储变量 在Python中,可以使用变量名来存储变量,例如: a = 10 b = ‘hello’ 在上面的示例中,我们使用变量名…

    python 2023年5月14日
    00
  • python list与numpy数组效率对比

    以下是关于“Python list与NumPy数组效率对比”的完整攻略。 背景 Python中的list和NumPy中的数组都可以用来存储和操作数据。但是,它们在内部实现和性能方面存在很大的差异。Python的list是一种动态数组可以存储任意类型的数据,但是在处理大量数据时,它的性能会受到限制。NumPy的数组是一种静态,可以存储同一类型的数据,并且在处理…

    python 2023年5月14日
    00
  • 浅谈numpy库的常用基本操作方法

    浅谈Numpy库的常用基本操作方法 简介 NumPy是Python中用于科学计算的一个重要的库,它提供了高效的多维数组array和与之相关的量。本文将详细讲解numpy库的常用基本操作方法,包括创建数组、数组的索引和切片、数组的形状操作、数组的数学运算等。 数组 使用NumPy创建数组的方法有多种,包括使用array()函数、使用zeros()函数、使用on…

    python 2023年5月14日
    00
  • python conda操作方法

    Pythonconda是一个Python的包管理器和环境管理器,可以方便地安装、升级和管理Python包和环境。以下是Pythonconda操作方法的完整攻略,包括Pythonconda的安装、环境管理和包管理等方面的介绍和示例说明: 安装Pythonconda 首先,需要从Anaconda官网下载适合自己操作系统的Pythonconda安装包,然后按照安装…

    python 2023年5月14日
    00
  • numpy.random.shuffle打乱顺序函数的实现

    以下是关于“numpy.random.shuffle打乱顺序函数的实现”的完整攻略。 numpy.random.shuffle函数的介绍 numpy.random.shuffle函数是numpy中用于打乱数组顺序的函数。它随机打乱一个数组的顺序,而到一个新的随机数组。函数的语法如下: numpy.random.shuffle(x) ` 其中,x是要打乱顺序的…

    python 2023年5月14日
    00
  • Python之Numpy 常用函数总结

    Python之Numpy 常用函数总结 Numpy是Python中用于科学计算的一个重要库,它提供了高效的多维数组对象和各种派生对象,包括矩和张量等。本攻略将详细介绍Python Numpy模块的常用函数。 安装Numpy模块 使用Numpy模块前,需要先安装它。可以使用以下命令在命令中安装Numpy模块: pip install numpy 导入Numpy…

    python 2023年5月13日
    00
  • Python 机器学习库 NumPy入门教程

    Python机器学习库NumPy入门教程 简介 NumPy是Python中一个非常流行的数值计算库,它提供了许多常用的数学函数和工具。NumPy的主要特点是它支持高效的数组操作和广播功能,这使得它成为了许多科学计算和机器学习任务的首选库。本攻略将详细讲解如何使用NumPy进行数值计算和数组操作。 安装 在使用NumPy之前,我们需要先安装它。可以使用以下命令…

    python 2023年5月13日
    00
  • 基于MTCNN/TensorFlow实现人脸检测

    基于MTCNN/TensorFlow实现人脸检测 介绍 在计算机视觉领域中,人脸检测是一个重要的工具,它在很多应用中都有广泛的应用,例如人脸识别、人脸跟踪、动态表情识别等等。本文将介绍如何使用MTCNN/TensorFlow来实现人脸检测。 MTCNN介绍 MTCNN是一种用于人脸检测的深度学习算法,它是由Google实验室在2016年提出的。MTCNN可以…

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