python:并发编程(十二)

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

前言

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

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

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

下一篇文章地址如下:

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

一、实战

1、模拟一个实时聊天系统。每个协程代表一个用户,用户可以发送和接收消息。所有消息都打印到控制台上

import asyncio

# 定义聊天用户类
class ChatUser:
    def __init__(self, name):
        self.name = name

    async def send_message(self, message):
        print(f"{self.name}: Sending message: {message}")
        await asyncio.sleep(1)  # 模拟发送消息的延迟

    async def receive_message(self, message):
        print(f"{self.name}: Received message: {message}")
        await asyncio.sleep(1)  # 模拟接收消息的延迟

# 定义聊天任务
async def chat_task(user):
    while True:
        message = input(f"{user.name}: Enter message (or 'quit' to exit): ")
        if message == "quit":
            break
        await user.send_message(message)
        await user.receive_message(message)

# 创建聊天用户
user1 = ChatUser("User1")
user2 = ChatUser("User2")

# 创建事件循环
loop = asyncio.get_event_loop()

# 运行聊天任务
tasks = [
    asyncio.ensure_future(chat_task(user1)),
    asyncio.ensure_future(chat_task(user2))
]
loop.run_until_complete(asyncio.wait(tasks))

# 关闭事件循环
loop.close()

在上述代码中,我们创建了两个聊天用户对象user1user2,并使用chat_task函数定义了聊天任务。每个聊天任务通过协程实现用户的发送和接收消息的功能。在主循环中,我们运行了两个聊天任务,并使用asyncio.wait()等待所有任务完成。最后,我们关闭了事件循环。

通过运行以上代码,每个用户可以在控制台上输入消息,并将消息发送给对方,同时也能接收对方发送的消息,并将消息打印到控制台上。这样模拟了一个简单的实时聊天系统。

2、模拟多个车辆同时进入停车场并争夺车位。每个协程代表一个车辆,进入停车场后等待随机时间,然后离开停车场

import asyncio
import random

# 定义停车场类
class ParkingLot:
    def __init__(self, capacity):
        self.capacity = capacity
        self.available_spots = capacity

    async def enter(self, car):
        print(f"Car {car} entering the parking lot.")
        if self.available_spots == 0:
            print(f"Car {car} is waiting for a spot.")
            await asyncio.sleep(1)  # 模拟等待时间
            await self.enter(car)  # 递归调用,继续尝试进入停车场
        else:
            self.available_spots -= 1
            print(f"Car {car} parked. Available spots: {self.available_spots}")

    async def exit(self, car):
        await asyncio.sleep(random.randint(1, 5))  # 模拟停留时间
        self.available_spots += 1
        print(f"Car {car} left the parking lot. Available spots: {self.available_spots}")

# 定义车辆任务
async def car_task(car, parking_lot):
    await parking_lot.enter(car)
    await parking_lot.exit(car)

# 创建停车场对象
parking_lot = ParkingLot(capacity=5)

# 创建事件循环
loop = asyncio.get_event_loop()

# 创建车辆任务
tasks = [
    asyncio.ensure_future(car_task(car, parking_lot)) for car in range(10)
]
loop.run_until_complete(asyncio.wait(tasks))

# 关闭事件循环
loop.close()

在上述代码中,我们创建了一个停车场对象parking_lot,并使用car_task函数定义了车辆任务。每个车辆通过协程实现进入停车场和离开停车场的功能。在主循环中,我们创建了10个车辆任务,并使用asyncio.wait()等待所有任务完成。每个车辆进入停车场时,如果停车场没有可用车位,则等待一段时间后再次尝试进入停车场,直到成功进入为止。每个车辆停留的时间是随机的,模拟了车辆在停车场停留的情况。

通过运行以上代码,多个车辆可以同时进入停车场并争夺车位,等待一段时间后离开停车场,同时打印出相关信息。这样模拟了多车辆同时进入停车场的情景。

3、实现并发地读取多个文件的内容,并将读取到的内容合并到一个结果字符串中

import asyncio

async def read_file(file_name):
    print(f"Reading file: {file_name}")
    content = ""
    try:
        with open(file_name, 'r', encoding="utf-8", errors='ignore') as file:
            content = file.read()
    except FileNotFoundError:
        print(f"File not found: {file_name}")
    return content

async def read_files(file_names):
    tasks = [read_file(file_name) for file_name in file_names]
    results = await asyncio.gather(*tasks)
    return "".join(results)

# 要读取的文件列表
files = ["file1.txt", "file2.txt", "file3.txt"]

# 创建事件循环
loop = asyncio.get_event_loop()

# 执行并发读取文件任务
result = loop.run_until_complete(read_files(files))
print("Merged content:", result)

# 关闭事件循环
loop.close()

在上述代码中,我们定义了read_file函数,用于读取单个文件的内容,并将内容作为协程返回。然后,我们定义了read_files函数,该函数接收一个文件名列表,创建多个read_file协程任务,并使用asyncio.gather等待所有任务完成,并将结果合并到一个字符串中。

在主循环中,我们创建了一个事件循环对象,并使用run_until_complete方法运行read_files协程任务,并将文件列表传递给它。最后,我们打印合并后的内容结果。

通过运行以上代码,可以并发地读取多个文件的内容,并将内容合并到一个结果字符串中。这样可以更高效地处理文件读取操作,提高程序的执行速度。

二、asyncio模块主要功能

1、使用asyncawait关键字

在定义协程函数时,使用async关键字标记函数为协程函数,然后在协程内部使用await关键字来等待异步操作的完成。

2、使用asyncio.run()来运行主协程

可以使用asyncio.run()函数来运行主协程,并自动创建和关闭事件循环,简化代码结构。

3、使用asyncio.gather()同时等待多个协程任务

asyncio.gather()函数可以接收多个协程任务作为参数,并等待它们全部完成。这样可以实现并发执行多个任务。

4、使用asyncio.wait()来处理可迭代对象中的协程任务

asyncio.wait()函数接收一个可迭代对象(如列表或集合)中的协程任务,并等待它们中的任何一个完成。可以使用return_when参数指定等待条件,如asyncio.FIRST_COMPLETEDasyncio.ALL_COMPLETED等。

5、使用asyncio.sleep()来创建暂停时间

asyncio.sleep()函数可以在协程中创建一个暂停时间,让事件循环暂停一段指定的时间,以便其他协程有机会执行。

6、使用asyncio.TimeoutError来处理超时

可以使用asyncio.wait_for()函数来设置协程任务的超时时间,并捕获asyncio.TimeoutError异常来处理超时情况。

7、使用asyncio.Lock()实现互斥锁

asyncio.Lock()类提供了互斥锁的机制,可以在协程中使用async with语句来获取和释放锁,确保同一时间只有一个协程可以访问共享资源。

8、使用asyncio.Queue()实现协程间的消息传递

asyncio.Queue()类可以用作协程之间的消息传递通道。一个协程可以将消息放入队列,而另一个协程可以从队列中获取消息,实现协程间的异步通信。

9、使用asyncio.run_coroutine_threadsafe()在多线程中调度协程

asyncio.run_coroutine_threadsafe()函数可以在多线程环境中调度协程任务,并将其提交给事件循环进行执行。

10、使用asyncio.ensure_future()来包装协程

asyncio.ensure_future()函数可以将协程包装为Task对象,以便在事件循环中进行调度和管理。文章来源地址https://www.toymoban.com/news/detail-490837.html

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

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

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

相关文章

  • 如何把aac转化为mp3?大家和我一起往下学习

        如何把aac转化为mp3?aac是一种先进的音频编码格式,通过较小的文件大小提供出色的音质体验。然而,由于其相对较少的普及度,与MP3相比,兼容性稍显不足,有些播放器可能无法直接识别aac格式。在某种程度上,我们可以将aac格式称为一种小众格式。考虑到这一点,一

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月09日
    浏览(26)
  • Python并发编程之进程理论

    本文将详细介绍 进程 相关概念。 计算机上的未运行的QQ、Wechat等都属于程序,但是一旦当这些程序运行起来的话,就可以被称为进程。因此可以如下定义程序和进程: 程序:就是存在硬盘上的一堆代码。 进程:就是正在运行的程序。 程序就是一堆代码的集合,本身并没有

    2024年02月03日
    浏览(26)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包