首页 > 编程语言 >Python - 并发模型

Python - 并发模型

时间:2023-05-08 21:56:17浏览次数:37  
标签:set Python 模型 spinner 并发 调用 线程 Event wait

import itertools
import time
from threading import Thread, Event


def spin(msg: str, done: Event) -> None:
    for char in itertools.cycle(r'\|/-'): # 1
        status = f'\r{char}{msg}' # 2
        print(status, end='', flush=True)
        if done.wait(.1): # 3
            break # 4
    blanks = ' ' * len(status)
    print(f'\r{blanks}\r', end='') #5
    
def slow() -> int:
    time.sleep(3) # 7
    return 42

'''
1. 这是一个无限循环,因为itertools.cycle 一次产出一个字符,一直反复迭代字符串
2. 用文本实现动画的技巧: 使用ASCCI 回车符('\r') 把光标移动到行头
3. 如果其他线程设置了set(),则Event.wait(timeout=None) 方法返回True
   如果其他线程未设置set(), 则经过timeout 时间后返回False,这里把暂停时间设置为0.1秒,作用是把动画的
   帧率设为10fps。如果想指针旋转的快些,可以把值设置的小一些
4. 退出无限循环
5. 显示空格,并把光标移到开头,清空状态行
6.slow() 由主线程调用。假设有一个API通过网络发送,速度很慢。调用sleep 阻塞主线程,但是GIL已被释放,因此指针还能继续转动
'''

def supervisor() -> int:
    done = Event()
    spinner = Thread(target=spin, args=('thinking!', done))
    print(f'spinner object:{spinner}')
    spinner.start()
    result = slow()
    done.set()
    spinner.join()
    return result


def main() -> None:
    result = supervisor()
    print(f'AnswerL: {result}')


if __name__ == '__main__':
    main()


运行中:

运行结束:

通过这个实例,要了解最重要的一点:

调用 time.sleep()阻塞所在的线程,但是释放GIL,其他Pyhton线程可以继续运行
在Python中,协调线程的信号机制,使用threading.Event 类最简单。Event 实例有一个内部布尔标志,开始时为False,
调用Event.set() 可把这个标志设为True。这个标志为False时,在一个线程中调用Event.wait(),该线程将被阻塞,直到另一个线程
调用Event.set(),致使Event.wait()返回True。使用Event.wait(s) 设置一个暂停时间(单位秒),经过这段时间后,Event.wait(s)
调用返回False,如果一个线程调用Event.set(),则立即返回True

标签:set,Python,模型,spinner,并发,调用,线程,Event,wait
From: https://www.cnblogs.com/czzz/p/17383269.html

相关文章

  • python14:递归函数
    概念:在一个函数内部不调用其他函数,而是自己本身的话,这个函数就是递归函数。优点:看起来简单缺点:容易导致栈溢出,占内存。例子:defjiecheng(n):#result=1#foriteminrange(1,n+1):#result*=item#pass#returnresult##print('结果为:{}'.form......
  • 部署ChatGLM6B模型过程
    背景大语言模型的本地化部署尝试步骤下载项目下载页:https://github.com/josStorer/selfhostedAI/releases/tag/v2下载selfhostedAI-chatglm-6b-int4-widoowed-nvidia.7z.001-003压缩包解压后,更新项目:update.bat安装pytorchforgpupipinstalltorch1.13.1+cu117t......
  • Python + Selenium,分分钟搭建 Web 自动化测试框架!
    在程序员的世界中,一切重复性的工作,都应该通过程序自动执行。「自动化测试」就是一个最好的例子。随着互联网应用开发周期越来越短,迭代速度越来越快,只会点点点,不懂开发的手工测试,已经无法满足如今的业务要求,只能被企业逐步裁员淘汰。「自动化测试和持续测试」就成为了业界主流。......
  • python GUI(beeware) + uiautomator2 实现root后的安卓手机自动执行脚本
    python环境:python3.81:安装beewarebeeware教程:https://docs.beeware.org/en/latest/tutorial/tutorial-2.html2:安装python模块uiautomator23:测试代码代码结构 app.py"""Myfirstapplication"""fromtoga.styleimportPackfrom.dy_dianzanim......
  • 深入理解 python 虚拟机:描述器的王炸应用-property、staticmethod 和 classmehtod
    深入理解python虚拟机:描述器的王炸应用-property、staticmethod和classmehtod在本篇文章当中主要给大家介绍描述器在python语言当中有哪些应用,主要介绍如何使用python语言实现python内置的proterty、staticmethod和classmethod。property当你在编写Python代码......
  • Python实操面试题
    1、一行代码实现1--100之和#利用sum()函数求和sum(range(1,101))2、如何在一个函数内部修改全局变量#利用global在函数声明修改全局变量a=5deffunc(): globalaa=10func()print(a)#结果:103、列出5个python标准库'''os:提供了不少与操作系统......
  • python-Queue队列
    队列Queue提供同步的、线程安全的队列类,可以用于线程之间的线程通信。queue模块实现了多生产者、多消费者队列。这特别适用于消息必须安全地在多线程交换的线程编程。该模块实现了三种类型的队列,它们的区别是任务取回的顺序。在FIFO队列中,先添加任务的先取回。在LIFO队列中,最......
  • 时间序列的STL分解Python代码——以验潮站数据为例
    1.时间序列分解的作用和意义时间序列通常包括如下几种成分:一个时间序列包含三种影响因素: 长期趋势:在一个相当长的时间内表现为一种近似直线的持续向上、向下或平稳的趋势。季节变动:受季节变化影响所形成的一种长度和幅度固定的短期周期波动周期变动:与季节变动类似,但是波动......
  • python-手动借助google翻译来翻译文档
    1importos2importre3'''4读取指定的html文件5去掉所有的换行符6正则匹配特定项目:(?<=<divclass="block">).+?(?=</div>)7然后替换掉:</code>|<code>|<i>|</i>==>""8......
  • Python基础面试题
    1、Python和Java、PHP、C、C#、C++等其他语言的对比?'''1.C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言。C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强......