python:并发编程(九)

这篇具有很好参考价值的文章主要介绍了python:并发编程(九)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文将和大家一起探讨python的多线程并发编程(下篇),使用内置基本库threading来实现并发,先通过官方来简单使用这个模块。先打好基础,能够有个基本的用法与认知,后续文章,我们再进行详细使用。

本文为python并发编程的第九篇,上一篇文章地址如下:

python:并发编程(八)_Lion King的博客-CSDN博客

下一篇文章地址如下:

python:并发编程(十)_Lion King的博客-CSDN博客

一、实战

1、创建两个线程,一个线程打印偶数,另一个线程打印奇数,要求按顺序打印

import threading

# 定义一个全局变量,用于控制打印的数字
num = 0

# 创建一个锁对象
lock = threading.Lock()

# 偶数线程函数
def print_even():
    global num
    while num < 10:
        # 获取锁
        lock.acquire()
        if num % 2 == 0:
            print("Even:", num)
            num += 1
        # 释放锁
        lock.release()

# 奇数线程函数
def print_odd():
    global num
    while num < 10:
        # 获取锁
        lock.acquire()
        if num % 2 != 0:
            print("Odd:", num)
            num += 1
        # 释放锁
        lock.release()

# 创建偶数线程
even_thread = threading.Thread(target=print_even)

# 创建奇数线程
odd_thread = threading.Thread(target=print_odd)

# 启动线程
even_thread.start()
odd_thread.start()

# 等待线程结束
even_thread.join()
odd_thread.join()

这个程序创建了两个线程,一个线程负责打印偶数,另一个线程负责打印奇数。使用全局变量num来控制打印的数字,初始值为0。通过获取锁来保证只有一个线程能够打印数字,并在打印后释放锁,以实现按顺序打印偶数和奇数。最后,使用join()方法等待两个线程执行完成。

运行这个程序,你将会看到按顺序打印出0到9的偶数和奇数。

2、创建三个线程,每个线程打印出一个字母(A、B、C),循环打印10次,要求按顺序打印ABCABC...

import threading

# 创建一个信号量,初始值为0
semaphore_A = threading.Semaphore(1)
semaphore_B = threading.Semaphore(0)
semaphore_C = threading.Semaphore(0)

# 打印A的线程函数
def print_A():
    for _ in range(10):
        # 获取A的信号量,允许打印A
        semaphore_A.acquire()
        print("A", end="")
        # 发送信号量给B,允许打印B
        semaphore_B.release()

# 打印B的线程函数
def print_B():
    for _ in range(10):
        # 获取B的信号量,允许打印B
        semaphore_B.acquire()
        print("B", end="")
        # 发送信号量给C,允许打印C
        semaphore_C.release()

# 打印C的线程函数
def print_C():
    for _ in range(10):
        # 获取C的信号量,允许打印C
        semaphore_C.acquire()
        print("C", end="")
        # 发送信号量给A,允许打印A
        semaphore_A.release()

# 创建三个线程
thread_A = threading.Thread(target=print_A)
thread_B = threading.Thread(target=print_B)
thread_C = threading.Thread(target=print_C)

# 启动线程
thread_A.start()
thread_B.start()
thread_C.start()

# 等待线程结束
thread_A.join()
thread_B.join()
thread_C.join()

这个程序创建了三个线程,分别用于打印字母A、B和C。通过使用信号量来控制线程的执行顺序。初始时,A线程获得信号量semaphore_A,允许打印A,然后它将信号量semaphore_B释放,允许B线程执行。B线程打印B后,释放信号量semaphore_C,允许C线程执行。C线程打印C后,释放信号量semaphore_A,允许A线程执行,从而形成ABCABC...的循环打印。

运行这个程序,你将会看到按顺序循环打印出ABCABC...,每个字母重复打印10次。

3、创建两个线程,一个线程用于输入数字,另一个线程用于计算数字的平方,并将结果输出

import threading
import queue

# 用于输入数字的线程函数
def input_number():
    while True:
        number = input("请输入一个数字(输入exit退出):")
        if number == "exit":
            break
        else:
            # 将输入的数字转换为整数,并发送给计算线程
            calculation_thread.queue.put(int(number))

# 用于计算数字平方并输出结果的线程函数
def calculate_square():
    while True:
        number = calculation_thread.queue.get()
        square = number ** 2
        print(f"{number} 的平方是 {square}")

# 创建一个线程间通信的队列
calculation_thread = threading.Thread(target=calculate_square)
calculation_thread.queue = queue.Queue()

# 创建输入数字的线程
input_thread = threading.Thread(target=input_number)

# 启动两个线程
calculation_thread.start()
input_thread.start()

# 等待输入线程结束
input_thread.join()

# 清空队列中的剩余元素
while not calculation_thread.queue.empty():
    number = calculation_thread.queue.get()
    square = number ** 2
    print(f"{number} 的平方是 {square}")

# 等待计算线程结束
calculation_thread.join()

这个程序创建了两个线程,一个用于输入数字,另一个用于计算数字的平方并输出结果。输入线程通过用户输入数字,并将其转换为整数后发送给计算线程。计算线程从队列中获取数字,并计算其平方后输出结果。当用户输入"exit"时,输入线程退出,然后程序等待队列中剩余的计算任务完成,并输出结果。

运行这个程序,你可以多次输入数字,程序将会实时计算并输出数字的平方。当你输入"exit"时,程序会等待队列中的剩余计算任务完成,并输出结果。

二、threading模块主要功能 

1、线程的创建

使用Thread类创建线程对象,将要执行的函数作为参数传递给线程对象的target参数。

2、启动线程

使用线程对象的start方法启动线程,该方法会自动调用线程函数。

3、线程同步

使用锁、条件、信号量等同步机制来控制线程的执行顺序和访问共享资源的安全性。

4、线程间通信

可以使用队列、事件、管道等机制实现线程间的通信,以便在不同线程之间传递数据或控制信息。

5、线程的终止

线程可以通过设置标志位或调用Thread类的stop方法来终止线程的执行。然而,直接终止线程可能导致资源泄漏或数据不一致,因此最好通过合理的设计和协调使线程正常退出。

6、线程的等待

使用join方法可以等待线程执行完成,主线程可以调用线程对象的join方法来等待子线程的结束。

7、线程的优先级

可以使用Thread类的setDaemon方法设置线程的优先级。

8、线程的异常处理

可以使用try-except语句捕获线程执行过程中可能抛出的异常,确保程序的健壮性。

9、线程的命名

可以给线程对象设置一个有意义的名称,方便调试和识别不同的线程。

10、线程的数量

在创建线程时要考虑系统的资源限制,过多的线程可能会导致资源竞争和性能下降。文章来源地址https://www.toymoban.com/news/detail-487046.html

到了这里,关于python:并发编程(九)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Verilog中的force语句用来强制更改信号的值,特别适用于仿真和调试。本文将深入探讨force语句在FPGA开发中的应用和注意事项。

    Verilog中的force语句用来强制更改信号的值,特别适用于仿真和调试。本文将深入探讨force语句在FPGA开发中的应用和注意事项。 首先,我们需要了解force语句的语法。其基本格式为force [time] signal = value。其中,time是可选参数,表示在何时开始强制更改信号的值;signal是要更改的

    2024年02月12日
    浏览(95)
  • python:并发编程(十二)

    本文将和大家一起探讨python的多协程并发编程 (下篇) ,使用内置基本库asyncio来实现并发,先通过官方来简单使用这个模块。先打好基础,能够有个基本的用法与认知,后续文章,我们再进行详细使用。 本文为python并发编程的第十二篇,上一篇文章地址如下: python:并发

    2024年02月09日
    浏览(33)
  • python并发编程

    多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成; 多进程:multiprocess,利用多核CPU的能力,真正的并行执行任务; 异步IO:asyncio,当线程比较多时,切换线程也会占用CPU资源,可在单线程中利用CPU和IO同时执行的原理,实现函数异步执行; 使用

    2024年02月11日
    浏览(37)
  • python:并发编程(九)

    本文将和大家一起探讨python的多线程并发编程 (下篇) ,使用内置基本库threading来实现并发,先通过官方来简单使用这个模块。先打好基础,能够有个基本的用法与认知,后续文章,我们再进行详细使用。 本文为python并发编程的第九篇,上一篇文章地址如下: python:并发编

    2024年02月09日
    浏览(34)
  • python:并发编程(十三)

    本文将和大家一起探讨python提供高级接口(进程池、线程池)的并发编程,使用内置基本库concurrent.futures来实现并发,先通过官方来简单使用这个模块。先打好基础,能够有个基本的用法与认知,后续文章,我们再进行详细使用。为什么说是concurrent.futures,而不是concurrent呢?

    2024年02月09日
    浏览(36)
  • python:并发编程(十六)

    本文将和大家一起探讨python并发编程的实际运用,会以一些我实际使用的案例,或者一些典型案例来分享。本文使用的案例是我实际使用的案例 (上篇) ,是基于之前效率不高的代码改写成并发编程的。让我们来看看改造的过程,这样就会对并发编程的高效率有个清晰地认

    2024年02月09日
    浏览(38)
  • python:并发编程(十五)

    本文将和大家一起探讨python并发编程的第三方模块,他们都是一些高度集成的模块,可运用于特定的场景。也就是,如果期望在特定领域实现并发编程,可以不需要只依赖python的内置并发编程模块,可更加高效地实现并发编程。 本文为python并发编程的第十五篇,上一篇文章地

    2024年02月09日
    浏览(40)
  • python:并发编程(一)

    本文将和大家一起探讨并发编程,而不限于python语言。后续文章,我们将一起学习并发编程的相关模块。为什么专门写并发编程的文章呢?一个重要原因是有趣,而且实用。写一些简单的脚本可能很少用到并发编程,但是要提高这些脚本的工作效率,并发编程是个不错的选择

    2024年02月09日
    浏览(37)
  • python:并发编程(二十三)

    本文将和大家一起探讨python并发编程的实际项目:win图形界面应用 (篇五,共八篇) ,系列文章将会从零开始构建项目,并逐渐完善项目,最终将项目打造成适用于高并发场景的应用。 本文为python并发编程的第二十三篇,上一篇文章地址如下: python:并发编程(二十二)

    2024年02月11日
    浏览(41)
  • python:并发编程(二十四)

    本文将和大家一起探讨python并发编程的实际项目:win图形界面应用 (篇六,共八篇) ,系列文章将会从零开始构建项目,并逐渐完善项目,最终将项目打造成适用于高并发场景的应用。 本文为python并发编程的第二十四篇,上一篇文章地址如下: python:并发编程(二十三)

    2024年02月11日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包