37.Python从入门到精通—Python3 多线程 线程模块 使用 threading 模块创建线程

这篇具有很好参考价值的文章主要介绍了37.Python从入门到精通—Python3 多线程 线程模块 使用 threading 模块创建线程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python3 多线程

线程模块

在Python 3中,线程模块已被重命名为_thread,同时还引入了更高级别的 threading 模块,它允许创建线程对象并提供了更多的方法来控制线程的行为。
以下是一个简单的示例,演示如何使用 threading 模块创建并启动线程:

import threading

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

thread1 = threading.Thread(target=print_numbers)
thread1.start()

print("Main thread exiting...")

在这个例子中,我们创建了一个名为 print_numbers 的函数,它将打印数字 1 到 10。然后,我们创建一个名为 thread1 的线程对象,将 print_numbers 函数作为目标传递给它。最后,我们调用 start 方法来启动线程。

注意,在这个例子中,主线程会继续执行,并且会在子线程完成之前退出。如果您希望等待线程完成后再退出,可以使用 join 方法:

import threading

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

thread1 = threading.Thread(target=print_numbers)
thread1.start()

thread1.join()

print("Main thread exiting...")

在这个例子中,我们添加了一个 join 方法来等待线程完成。这样,主线程将等待子线程完成后再退出。

使用 threading 模块创建线程

使用 Python 的 threading 模块可以方便地创建和管理多个线程。以下是一个简单的示例:

import threading

def worker():
    """线程要执行的任务"""
    print('Worker')

threads = []
for i in range(5):
    t = threading.Thread(target=worker)
    threads.append(t)
    t.start()

# 等待所有线程完成
for t in threads:
    t.join()

这个示例创建了 5 个线程,每个线程都执行 worker 函数。使用 threading.Thread 创建线程对象,传递一个 target参数,该参数是要在线程中执行的函数。然后使用 start 方法启动线程。最后,使用 join 方法等待所有线程完成。

需要注意的是,在多线程编程中,需要注意线程之间的同步问题,例如共享资源的访问问题等。可以使用锁、信号量等同步机制来解决这些问题。

线程同步

线程同步是指多个线程在访问共享资源时,通过协作来避免竞争条件的发生。在多线程编程中,如果没有进行适当的同步,可能会导致数据不一致或者程序崩溃等问题。
Python 中提供了多种方式来实现线程同步,下面介绍两种常用的方式:

锁(Lock):锁是最常用的同步机制,它可以防止多个线程同时访问共享资源。当一个线程获得锁时,其他线程必须等待该线程释放锁后才能访问共享资源。在 Python 中,可以使用 threading 模块中的 Lock 类来实现锁。

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

import threading

x = 0
lock = threading.Lock()

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

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

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

t1.start()
t2.start()

t1.join()
t2.join()

print("x = ", x)

在这个例子中,我们创建了两个线程,一个线程用于增加变量 x 的值,另一个线程用于减少变量 x 的值。为了避免竞争条件,我们使用 Lock对象来控制对变量 x 的访问。

条件变量(Condition):条件变量是一种高级别的同步机制,它允许线程在满足特定条件时等待或者继续执行。在 Python 中,可以使用 threading 模块中的 Condition 类来实现条件变量。

下面是一个简单的示例,演示如何使用 Condition 实现线程同步:

import threading

x = 0
condition = threading.Condition()

def increment():
    global x
    for i in range(100000):
        with condition:
            while x >= 5:
                condition.wait()
            x += 1
            condition.notify()

def decrement():
    global x
    for i in range(100000):
        with condition:
            while x <= 0:
                condition.wait()
            x -= 1
            condition.notify()

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

t1.start()
t2.start()

t1.join()
t2.join()

print("x = ", x)

在这个例子中,我们创建了两个线程,一个线程用于增加变量 x 的值,另一个线程用于减少变量 x 的值。为了避免竞争条件,我们使用
Condition 对象来控制对变量 x 的访问。在增加或减少变量 x 的值时,我们使用 wait 方法来等待特定的条件,使用 notify
方法来通知其他线程条件已经满足。

线程优先级队列( Queue)

线程优先级队列(Queue)是 Python 标准库中的一个模块,它提供了多线程编程中常用的队列数据结构,支持多线程间的安全数据交换和同步。
Queue 模块提供了三种类型的队列:FIFO(先进先出)队列、LIFO(后进先出)队列和优先级队列。其中,优先级队列是一种支持按照元素优先级排序的队列,优先级高的元素先被取出。
以下是一个使用优先级队列的简单示例:

import queue

q = queue.PriorityQueue()

q.put((2, 'code'))
q.put((1, 'eat'))
q.put((3, 'sleep'))

while not q.empty():
    item = q.get()
    print(item[0], item[1])

输出结果:
1 eat
2 code
3 sleep

在这个示例中,我们创建了一个优先级队列,并使用 put
方法将三个元素插入队列中,每个元素都是一个元组,第一个元素表示优先级,第二个元素是具体的数据。然后我们使用 get
方法从队列中取出元素,队列会按照元素的优先级从高到低排序,优先级相同的元素按照插入顺序排序。

需要注意的是,queue 模块提供的队列都是线程安全的,可以在多线程环境中使用。在多线程编程中,可以使用队列来实现线程之间的数据交换和同步。文章来源地址https://www.toymoban.com/news/detail-858951.html

到了这里,关于37.Python从入门到精通—Python3 多线程 线程模块 使用 threading 模块创建线程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 38.Python从入门到精通—Python3 XML 解析 什么是 XML Python 对 XML 的解析

    XML(可扩展标记语言)是一种用于描述数据的标记语言,它可以用于表示各种类型的数据,包括文本、图像、音频、视频等。XML 的语法类似于HTML,但它更加灵活,可以自定义标记,并且不依赖于任何特定的应用程序或操作系统。 XML的基本结构由元素、属性和文本组成。元素

    2024年04月11日
    浏览(38)
  • Python 线程池 (thread pool) 创建及使用 + 实例代码

    首先线程和线程池不管在哪个语言里面,理论都是通用的。对于开发来说,解决高并发问题离不开对多个线程处理。我们先从线程到线程池,从每个线程的运行到多个线程并行,再到线程池管理。由浅入深的理解如何在实际开发中,使用线程池来提高处理线程的效率。 线程(

    2024年02月05日
    浏览(46)
  • 31.Python从入门到精通—Python数据压缩 性能度量 测试模块

    🏘️🏘️个人主页:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,CSDN内容合伙人,阿里云社区专家博主,新星计划导师,在职数据分析师。 💕💕悲索之人烈焰加身,堕落者不可饶恕。永恒燃烧的羽翼,带我脱离凡间的沉沦。 🐘 希望大家能持续支持

    2024年04月14日
    浏览(33)
  • 《Python入门到精通》os模块详解,Python os标准库

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》 OS标准库是操作系统接口模块,提供了操作系统相关功能的调用函数。 使用OS标准库前,需要导入模块 import

    2024年02月13日
    浏览(49)
  • Python中threading模块 lock、Rlock的使用

    在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lock 、Rlock 、Semaphore 、Event 、Condition 用来保证线程之间的同步,后者

    2024年02月13日
    浏览(39)
  • 《Python入门到精通》time模块详解,Python time标准库,time库函数大全

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》

    2024年02月09日
    浏览(50)
  • 【Threads and QObjects,Thread-Support in Qt Modules】线程和QObjects,Qt模块中的线程支持

    Threads 继承了 QObjects类。它发出信号来指示线程已开始执行或已完成执行,并提供一些槽函数。 更有趣的是,QObjects可以在多个线程中使用,发出调用其他线程中槽的信号,并将事件发布到“live”在其他线程中的对象。这是可能的,因为每个线程都允许有自己的事件循环。

    2024年02月04日
    浏览(50)
  • 《Python入门到精通》webbrowser模块详解,Python webbrowser标准库,Python浏览器控制工具

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》 webbrowser 是Python的内置库,提供了访问Web浏览器的接口 使用前需要 「导入模块」 1)使用 「默认浏览器」 打开

    2024年02月10日
    浏览(44)
  • 【Linux从入门到精通】线程互斥与互斥锁的使用与原理详解

      上篇文章我们对线程 | 线程介绍线程控制介绍后,本篇文章将会对多线程中的线程互斥与互斥锁的概念进行详解。同时结合实际例子解释了可重入与不被重入函数、临界资源与临界区和原子性的概念。希望本篇文章会对你有所帮助。 文章目录 引入 一、重入与临界 1、1 可重

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包