当前位置: 首页 > news >正文

单线程+异步I/O的编程模型:协程

     现代操作系统对I/O操作的改进中最为重要的就是支持异步I/O。如果充分利用操作系统提供的异步I/O支持,就可以用单进程单线程模型来执行多任务,这种全新的模型称为事件驱动模型。Nginx就是支持异步I/O的Web服务器,它在单核CPU上采用单进程模型就可以高效地支持多任务。在多核CPU上,可以运行多个进程(数量与CPU核心数相同),充分利用多核CPU。用Node.js开发的服务器端程序也使用了这种工作模式,这也是当下并发编程的一种流行方案。

      在Python语言中,单线程+异步I/O的编程模型称为协程,有了协程的支持,就可以基于事件驱动编写高效的多任务程序。协程最大的优势就是极高的执行效率,因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销。协程的第二个优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不用加锁,只需要判断状态就好了,所以执行效率比多线程高很多。如果想要充分利用CPU的多核特性,最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

应用案例

例子1:将耗时间的任务放到线程中以获得更好的用户体验。

如下所示的界面中,有“下载”和“关于”两个按钮,用休眠的方式模拟点击“下载”按钮会联网下载文件需要耗费10秒的时间,如果不使用“多线程”,我们会发现,当点击“下载”按钮后整个程序的其他部分都被这个耗时间的任务阻塞而无法执行了,这显然是非常糟糕的用户体验,代码如下所示

import time
import tkinter
import tkinter.messageboxdef download():# 模拟下载任务需要花费10秒钟时间time.sleep(10)tkinter.messagebox.showinfo('提示', '下载完成!')def show_about():tkinter.messagebox.showinfo('关于', '作者: 骆昊(v1.0)')def main():top = tkinter.Tk()top.title('单线程')top.geometry('200x150')top.wm_attributes('-topmost', True)panel = tkinter.Frame(top)button1 = tkinter.Button(panel, text='下载', command=download)button1.pack(side='left')button2 = tkinter.Button(panel, text='关于', command=show_about)button2.pack(side='right')panel.pack(side='bottom')tkinter.mainloop()if __name__ == '__main__':main()

    如果使用多线程将耗时间的任务放到一个独立的线程中执行,这样就不会因为执行耗时间的任务而阻塞了主线程,修改后的代码如下所示。

import time
import tkinter
import tkinter.messagebox
from threading import Threaddef main():class DownloadTaskHandler(Thread):def run(self):time.sleep(10)tkinter.messagebox.showinfo('提示', '下载完成!')# 启用下载按钮button1.config(state=tkinter.NORMAL)def download():# 禁用下载按钮button1.config(state=tkinter.DISABLED)# 通过daemon参数将线程设置为守护线程(主程序退出就不再保留执行)# 在线程中处理耗时间的下载任务DownloadTaskHandler(daemon=True).start()def show_about():tkinter.messagebox.showinfo('关于', 'author骆昊')top = tkinter.Tk()top.title('单线程')top.geometry('200x150')top.wm_attributes('-topmost', 1)panel = tkinter.Frame(top)button1 = tkinter.Button(panel, text='下载', command=download)button1.pack(side='left')button2 = tkinter.Button(panel, text='关于', command=show_about)button2.pack(side='right')panel.pack(side='bottom')tkinter.mainloop()if __name__ == '__main__':main()

转自author:骆昊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-2893.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

Git一个项目中引用其他Git仓库

// git submodule add [git地址] [目录位置] $ git submodule add https://xxx/gittest.git src/gittest使用submodule后 在当前git目录下会生成一个 .gitmodules 文件 如果但当前目录已经存在了一个 .gitmodules,命令需要更改为 $ git submodule add -f https://…...

2021.6.1

链接查询 连接查询可分为内连接和外连接。 一.内连接:内连接分3种:交叉连接、相等连接、自然连接。 1.内连接语法: 1.交叉连接: 交叉链接又称“笛卡尔链接”,即所有类型的内连接的基础 语法 select * from table…...

SpringBoot入门及官网教程

文章目录http://felord.cn/_doc/_springboot/2.1.5.RELEASE/_book/https://spring.io/projects/spring-boothttps://springboot.io/http://felord.cn/_doc/_springboot/2.1.5.RELEASE/_book/ https://spring.io/projects/spring-boot https://springboot.io/...

c++:mt19937生成随机数

随机生成&#xff1a; int rd(){mt19937 rd1(time(NULL));return rd1(); }指定随机数的生成范围&#xff1a; int rd(){mt19937 rd1(time(NULL));uniform_int_distribution<int>t(0,100000);//指定范围return t(rd1); }...

js中find和findIndex的使用

ES6为Array增加了find()&#xff0c;findIndex函数。 find()函数用来查找目标元素&#xff0c;找到就返回该元素&#xff0c;找不到返回undefined。 findIndex()函数也是查找目标元素&#xff0c;找到就返回元素的位置&#xff0c;找不到就返回-1。 他们的都是一个查找回调函…...

投资理财1

1. 投资术语 熔断&#xff1a;也叫自动停盘机制&#xff0c;是指当股指波幅达到规定的熔断点时&#xff0c;交易所为控制风险采取的暂停交易措施。具体说是对某一合约在达到涨跌停板之前&#xff0c;设置一个熔断价格&#xff0c;使合约买卖报价在一段时间内只能在这一价格范围…...

【项目】springboot中使用kaptcha生成验证码,登录时密码加盐处理

记录使用kaptcha的过程 为前后端分离项目&#xff0c;前端vue框架 0.下载jar包 在maven的网站https://mvnrepository.com/search?qcom.github.penggle 搜索下载jar 导入到工程中 1.添加依赖 <dependency><groupId>com.github.penggle</groupId><art…...

Mybatis源码研究之DatabaseIdProvider

借助Mybatis提供的 databaseId特性&#xff0c;我们可以实现让应用同时支持多种类型的数据库。 0. 目录这里写目录标题1. 测试用例2. 原理解析3. databaseId的其它应用4. Links1. 测试用例 相关的配置和测试用例如下 &#xff08;这里我们以源生的mybatis为例&#xff0c;与Sp…...

学生成绩管理系统+打包

文章目录文件管理&#xff1a;D:\hyt\python\pytorch_graduate\file_management成绩管理&#xff1a;D:\hyt\python\pytorch_graduate\stusystem打包&#xff1a;D:\hyt\python\pytorch_graduate\package_test学生成绩管理系统0.基础原理1.文件管理2 学生管理系统Tk打包1.基础原…...

Yocto Build with Bitbake的调试

https://docs.yoctoproject.org/dev-manual/common-tasks.html#recipe-logging-mechanisms 官方文档里有输出调试信息的方法。包含两种&#xff0c;一种是调用python的&#xff0c;一种是bash的。 建议直接使用warning方法&#xff0c;保证输出级别足够。 另外&#xff0c;在…...

IntentService源码分析指南

转载链接&#xff1a;https://www.jianshu.com/p/8a3c44a9173a...

为啥集群小文件治理那么重要,你真的懂吗?

小文件是 Hadoop 集群运维中的常见挑战&#xff0c;尤其对于大规模运行的集群来说可谓至关重要。如果处理不好&#xff0c;可能会导致许多并发症。Hadoop集群本质是为了TB,PB规模的数据存储和计算因运而生的。为啥大数据开发都说小文件的治理重要&#xff0c;说HDFS 存储小文件…...

Flink大数据实时计算系列-第一个程序JAVA版本-分组统计

Flink大数据实时计算系列-第一个程序JAVA版本-分组 在基线版本上增加了分组统计的代码 #Flink代码 package com.flinkniu.flink.operator;import org.apache.flink.api.common.typeinfo.Types; import org.apache.flink...

Ant Design Vue实现a-table表格单元格合并

Ant Design Vue实现a-table表格单元格合并 参考Ant design Vue官网关于行和列合并api https://antdv.com/components/table-cn/ 下面官网对表格合并这块的描述 &#xff01;&#xff01;&#xff01;注意注意注意重要事情说三遍&#xff1a;很多同学都习惯性的将columns写在d…...

【CoppeliaSim】Solidworks中模型导出模型到V-REP

一、下载安装插件 插件名称&#xff1a;sw2urdfSetup 下载地址&#xff1a;https://github.com/ros/solidworks_urdf_exporter/releases/tag/1.6.0 下载后直接安装即可。安装成功后&#xff0c;可在SolidWorks的菜单栏中看到&#xff1a;工具-Tools-Export as URDF 二、导出…...

css中id和class的区别

css中id和class的区别ID是唯一的类不是唯一的语法区别ID是唯一的 每个元素仅可以有一个ID每个页面仅可以有一个元素拥有这个ID 类不是唯一的 你可以在多个元素中使用相同的类你可以使用多个类在一个元素中 语法区别 id对应css是用样式选择符“#”&#xff08;井号&#xff…...

力扣刷题:动态规划篇

目录322. 零钱兑换题目介绍题目实现5. 最长回文子串题目介绍题目实现518. 零钱兑换 II题目介绍题目实现53. 最大子序和题目介绍题目实现63. 不同路径 II题目介绍[62. 不同路径](https://leetcode-cn.com/problems/unique-paths/)题目实现70. 爬楼梯题目介绍题目实现72. 编辑距离…...

Java面试list 和 set 区别

List和Set的区别 List:&#xff1a;有序&#xff0c;按对象进入的的序保存对象&#xff0c;可可允许多个Null元素对象&#xff0c;可以使用lterator迭取出所有元素。在逐一便历&#xff0c;也可以使用get(int index)获取指定下标的元素 Set&#xff1a;无序&#xff0c;不可重复…...

诚意分享:这里有份超全Java体系化进阶学习图谱

摘要 Apache Kafka是一个分布式消息发布订阅系统。它最初由LinkedIn公司基于独特的设计实现为一个分布式的提交日志系统( a distributed commit log)&#xff0c;之后成为Apache项目的一部分。 成千上万的企业都在使用Kafka&#xff0c;三分之一的世界500强公司也在其中&…...

requests+re爬取猫眼电影排行

import requests from requests.exceptions import RequestException import re,json,timedef get_one_page(url):#获取网页信息try:headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/53…...

GPIO 初安装2021.6.1

1、参照贴文https://blog.csdn.net/cynophile/article/details/99310678 安装GPIO库 sudo pip install Jetson.GPIO sudo pip3 install Jetson.GPIO 创建一个新的gpio用户组。然后将用户添加到新创建的组中&#xff0c;your_user_name是用户名。 sudo groupadd -f -r gpio …...

【学习笔记】Java 8函数式编程#Lambda表达式#方法引用

全文目录函数式编程&#xff1a;Functional programming函数式编程的一些基本概念函数式编程的定义&#xff1a;程序的副作用&#xff1a;函数编程与数学函数&#xff1a;设计函数式编程应该遵循的原则&#xff1a;First-Class and Higher-Order Functions纯函数不变性引用透明…...

强推!程序员必备!CSDN浏览器插件,让码字效率提升n倍,颜值与实力并存

目 录 一 写在前面 二 测评信息 三 测评体验 3.1 安装方便 3.2 始于颜值 3.2.1 简约美观的主题 3.2.2 多变时尚的风格 3.3 忠于强大 3.3.1 快捷的搜索 3.3.2 丰富的功能 3.3.3 开发者神器 3.4 一些建议 四 写在最后 一 写在前面 你是否对极致的用户体验有很高的…...

Window10 远程连接(校内网实验室电脑连接寝室电脑)

Windows10 远程连接win10远连用途被连机设置密钥升级开启文件打印机共享&#xff08;回显请求-ICMPv4)记住电脑内网IP和你的微软账号&#xff01;临时机开启连接win10远连用途 windows自带的远程连接&#xff0c;使用方便。 我用于校内实验室或者图书馆电脑操作宿舍电脑&#…...

js中find和findIndex的使用

ES6为Array增加了find()&#xff0c;findIndex函数。 find()函数用来查找目标元素&#xff0c;找到就返回该元素&#xff0c;找不到返回undefined。 findIndex()函数也是查找目标元素&#xff0c;找到就返回元素的位置&#xff0c;找不到就返回-1。 他们的都是一个查找回调函…...

博客后端开发

数据库设计 用户表 tb_user 字段名类型长度不是null主键注释idvarchar255是是主键accountvarchar255是 账户passwordvarchar255是 密码namevarchar255否 别名emailvarchar128否 邮箱introductionvarchar255否 个人简介avatarvarchar255否 头像create_timedatetime0是 注册时间…...

c++:mt19937生成随机数

随机生成&#xff1a; int rd(){mt19937 rd1(time(NULL));return rd1(); }指定随机数的生成范围&#xff1a; int rd(){mt19937 rd1(time(NULL));uniform_int_distribution<int>t(0,100000);//指定范围return t(rd1); }...

Docker和k8s知识概括

Docker和k8s知识概括Docker简介K8S简介Docker简介 Docker简介&#xff1a; 2010年&#xff0c;几个搞IT的年轻人&#xff0c;在美国旧金山成立了一家名叫“dotCloud”的公司。这家公司主要提供基于PaaS的云计算技术服务。具体来说&#xff0c;是和LXC有关的容器技术。LXC&…...

2021.6.1

链接查询 连接查询可分为内连接和外连接。 一.内连接&#xff1a;内连接分3种&#xff1a;交叉连接、相等连接、自然连接。 1.内连接语法&#xff1a; 1.交叉连接&#xff1a; 交叉链接又称“笛卡尔链接”&#xff0c;即所有类型的内连接的基础 语法 select * from table…...

【vue】vue3学习笔记(三)

接上篇 面包屑 安装path-to-regexpcomponent/breadcrumb/index <template><el-breadcrumb class"app-breadcrumb breadcrumb-container" separator"/"><el-breadcrumb-item v-for"(item, index) in levelList" :key"item…...

TE2E和GE2E损失函数区别

谷歌提出了两种损失函数TE2E&#xff08;Tuple-based end-to-end&#xff09;、GE2E&#xff08;Generalized end-to-end&#xff09;.今天对这两种进行记录。 一、TE2E 在训练中分为2个阶段&#xff1a;登记和检验。每步训练中数据包含 xj∼x_{j∼}xj∼​和M个登记会话xkmx_{…...

android 短信打开APP

需求说明&#xff1a;用户收到短信&#xff0c;点击短信链接 打开APP&#xff0c;有直接打开&#xff0c;没有下载APP功能分析&#xff1a;首先写一个H5界面&#xff0c;界面内容有两个按钮&#xff0c;一个下载&#xff0c;一个打开&#xff0c;没有点击下载去安装&#xff0c…...

【网络安全】红队攻防之基础免杀

引言 本文主要介绍“反射型dll注入”及“柔性加载”技术。 反射型dll注入 为什么需要反射型dll注入 常规的dll注入代码如下&#xff1a; int main(int argc, char *argv[]) { HANDLE processHandle; PVOID remoteBuffer; wchar_t dllPath[] TEXT("C:\\experiments\\…...

android 打开短信应用,通过短信打开手机应用

最近在做毕业设计的时候&#xff0c;要通过短信打开手机上特定的APP&#xff0c;于是搜索了一些资料。通过短信中的链接打开应用最主要的是对manifest文件的配置,比如希望通过短信中的 http://qicaiz.com链接打开特定的APP,要对manifest文件进行以下配置&#xff1a;其中&#…...

android开发发送短信,Android开发入门之发送短信

第一步&#xff1a;新建一个Android工程命名为03.Sms目录结构如下图&#xff1a;第二步&#xff1a;修改activity_main.xml布局文件代码如下&#xff1a;xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_…...

android 是否有短信权限,Android 短信相关的权限和支持的短信协议

短信相关权限android:name"android.permission.SEND_SMS"/>android:name"android.permission.READ_SMS"/>android:name"android.permission.WRITE_SMS" />android:name"android.permission.RECEIVE_SMS"/>系统的短信库存在…...

android发送短信界面,android调用系统发送短信 和 已发送短信界面

1. 调用系统发送短信界面(并指定短信接收人和短信内容)Uri smsToUri Uri.parse("smsto:10086");Intent mIntent new Intent(android.content.Intent.ACTION_SENDTO, smsToUri );mIntent.putExtra("sms_body", "The SMS text");startActivity( …...

android 删除短信无效,android删除短信(绕过权限)

android的很多功能都是需要权限才能操作&#xff0c;还是有很多功能我们是可以直接操作的&#xff0c;只需要在配置文件中注明权限就行了&#xff0c;可是有些虽然注明了权限&#xff0c;但是还是会提示说你没权限。比如删除短信、让手机进入休眠状态(gotoSleep)。下面就介绍一…...

android读取短信代码,android读取短信示例分享

package com.homer.sms;import java.sql.Date;import java.text.SimpleDateFormat;import android.app.Activity;import android.database.Cursor;import android.database.sqlite.SQLiteException;import android.net.Uri;import android.os.Bundle;import android.util.Log;...

android sms 接收短信,Android SMS 短信操作

android的短信保存在短信库里&#xff0c;但并提供类似Contacts的公开的Content Provider方便操作。这里简单的介绍下&#xff1a;android中的短信信息保存在/data/data/com.android.providers.telephony/databases目录下的sqlite库中。常用的表有&#xff1a;canonical_addres…...

Android短信备份案例

[1] 通过使用getContentResolver内容解析者实现短信的读取 , 然后将其备份到xml 文件中, [2]通过getContentResolver还可以实现短信的插入 , 联系人的读取等功能. package jacky.smsbackups;import android.database.Cursor; import android.net.Uri; import android.os.Bund…...

android获取短信息,从其ID Android获取短信详细信息

我想得到短信的细节(数字,正文,来的时间);我只知道短信的身份.我可以使用此ID查询“content&#xff1a;// sms”并获取详细信息吗&#xff1f;目前,我可以循环查询每条消息并获取详细信息.但是当你必须从1000 sms获得单次sms细节10次时效率不高…..希望你能理解这个问题.感谢名…...

android 监听 短信,Android短信验证码监听解决onChange多次调用的方法

先说一句&#xff1a;MIUI请放弃治疗&#xff01;这里给个传送门&#xff1a;识别短信验证码并提取还是挺常见的一个需求。所要解决的问题主要有&#xff1a;1、如何监听2、如何提取短信中的验证码3、监听多次调用问题直接看下面代码吧&#xff0c;很明了。需要注意的点有就是o…...

android 开发 短信,Android开发之短信发送

今天要讲的是使用Android开发发送短信程序。我们先来看下运行效果图(1) 图(2)图(3)图(1)&#xff1a;当我们运行项目时&#xff0c;出现在屏幕的效果&#xff1b;图(2)&#xff1a;当我们输…...

基于android的短信收发,android 短信接收短信 与发送短信源码

【实例简介】【实例截图】【核心代码】package cn.dccssq;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsMessage;import android.widget.Toast;public clas…...

android 短信广播接收

public class SmsActivity extends AppCompatActivity {private Button btnSure;private String[] smsPermissions {Manifest.permission.READ_SMS,Manifest.permission.RECEIVE_SMS,Manifest.permission.SEND_SMS};Overrideprotected void onCreate(Nullable Bundle savedIn...

android短信删除,Android删除短信的方法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1.删除短信的函数&#xff0c;一条一条的删除所有短信/** Delete all SMS one by one*/public void deleteSMS() {try {ContentResolver CR getContentResolver();// Query SMSUri uriSms Uri.parse("content://sms/sent&qu…...

android 短信字体,安卓短信字体 安卓短信字体大小设置

1、先以小米手机为例&#xff0c;点击桌面上的“设置”。2、在设置里点击“字体大小”。3、进入字体设置页面&#xff0c;将下面的小圆圈向右滑动&#xff0c;字体就变大啦&#xff0c;当然向左就变小。4、设置好自己满意的字体大小点击“确定”。5、确定以后自动回到上一个菜单…...

android 实时同步短信,备份Android短信的4种方法你最好知道

第1部分&#xff1a;使用dr.fone备份Android文本消息 - 备份和还原(Android)如果您发现任何类型的技术工作令人生畏&#xff0c;这可能是您备份Android文本消息的最简单方法。在dr.fone - Backup&#xff06;Restore(Android)的帮助下&#xff0c;您将能够尽可能灵活地备份和恢…...

android 几种发送短信的方法

android中发送短信很简单&#xff0c; 首先要在Mainfest.xml中加入所需要的权限&#xff1a; 1 <uses-permission android:name"android.permission.SEND_SMS"></uses-permission> 2 <uses-permission android:name"android.permission.READ_SMS…...