一、实验目的
- 掌握和使用进程池
- 掌握和使用多线程
- 掌握和使用互斥锁
- 掌握协程的使用
二、实验内容
- 使用进程池计算区间内素数个数
- 使用多线程计算区间内合数个数
- 互斥锁的设计和使用
- 异步状态转换器
三、实验环境
在Educoder平台进行实验
四、实验要求
根据每个实训的每个关卡要求完成代码提交和测评
五、实验步骤
- 使用进程池计算区间内素数个数
第一个进行素数的判断
我们创建进程,并进行分区,然后通过分区
给每个分区的数进行计算
-
使用多线程计算区间内合数个数
进程里的单位是线程,线程可以拥有自己的副本,而不影响别的进程的数据
-
互斥锁的设计和使用
其基本思路是,当线程占用进程中的数据时进行上锁,然后其他线程没办法使用
-
异步状态转换器
逻辑很清楚:
举例:街上的自动售货机中明显能看到状态机逻辑。假设有一台只卖2元一瓶的汽水的售货机,只接受五毛和一块的硬币。初始状态是”未付款“,中间状态有”已付款5毛“,”已付款1块“,”已付款1.5块“,”已足额付款“,四个状态。状态切换的触发条件是”投一块硬币“和”投5毛硬币“两种,”到达足额付款“状态,还要进行余额清零和弹出汽水操作。 在下图中,可以看到系统有 S1, S2, S3, S4 四个状态, 0 和 1 是状态机可以从一个状态到另一个状态的值,例如,只有当只为1的时候,S0可以转换到S1,当只为0的时候, S0可以转换到S2。这个转换的过程就是根据条件来切换状态,题目中,我们会输入一组数字作为事件,根据这一组数字,完成状态转换并输出相应的动作,从 S0 开始,叫做 初始状态,最后到 S4,叫做结束状态
六、问题记录和实验总结(必写)
对于进程和线程的理解和使用,python方面的学习,更是对操作系统的理解
本次实验通过使用Python编程语言,学习了进程池、多线程、互斥锁和协程的基本概念和使用方法。在实验中,我们通过进程池实现了对区间内素数个数的计算,通过多线程实现了对区间内合数个数的计算,并且利用互斥锁确保了多线程操作时的数据安全。此外,还了解了协程的基本原理和使用方法,并实现了异步状态转换器。通过这些实验,我们更深入地理解了并发编程的概念和实现方式,提高了对Python并发编程模型的掌握程度
特别说明一下
asyncio模块
asyncio是Python 3.4版本引入的标准库,用于处理异步I/O。它提供了一组高层次的API,用于并发地运行Python协程,并控制它们的执行。asyncio被用作许多流行的Python异步框架的基础,包括Tornado、aiohttp和Twisted。
asyncio的基本概念
asyncio的核心概念是事件循环和协程。
事件循环是一个无限循环,它负责管理异步程序的执行。它从各种来源(例如网络套接字、文件系统和操作系统)接收事件,并将它们分发给相应的协程。
协程是可暂停的函数。它们使用async
关键字定义,并使用await
关键字暂停执行。当协程等待I/O完成时,事件循环会将其挂起,然后在I/O完成后继续执行它。
使用asyncio
要使用asyncio,首先需要创建一个事件循环。然后,可以使用asyncio.run()
函数运行协程。该函数将创建一个新的事件循环(如果尚未创建),运行指定的协程,然后关闭事件循环。
以下是一个简单的asyncio程序示例:
asyncio的优点
asyncio的主要优点是它可以提高并发应用程序的性能。通过允许协程在等待I/O完成时被阻塞,asyncio可以使应用程序在没有大量未使用线程的情况下有效地处理多个并发请求。
asyncio的另一个优点是它易于使用。其API直观且易于理解,并且有许多优秀的第三方库可用于简化常见异步编程任务。