Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何重构以接受多个客户端?

如何重构以接受多个客户端?
EN

Stack Overflow用户
提问于 2018-06-05 03:11:25
回答 1查看 202关注 0票数 1

我不明白为什么server.py版本1允许客户机被键盘中断并重新启动,而server.py版本2不允许:

server.py Version1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import asyncio

async def handle_client(reader, writer):
    while True:
        request = (await reader.read(128)).decode()
        writer.write('Received ok.'.encode())
        await writer.drain()

async def main():
    loop.create_task(asyncio.start_server(handle_client, 'localhost', 15555))

loop = asyncio.new_event_loop()
loop.create_task(main())
loop.run_forever()

server.py版本2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import asyncio

async def handle_client(reader, writer):
    while True:
        request = (await reader.read(128)).decode()
        if request == "hello":
            writer.write('Received ok.'.encode())
            await writer.drain()

async def main():
    loop.create_task(asyncio.start_server(handle_client, 'localhost', 15555))

loop = asyncio.new_event_loop()
loop.create_task(main())
loop.run_forever()

client.py:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import asyncio

async def make_connections():
    reader, writer = await asyncio.open_connection('localhost', 15555, loop=loop)
    loop.create_task(connect(reader, writer))


async def connect(reader, writer):
    writer.write("hello".encode())
    await writer.drain()
    result = await reader.read(128)
    print(result.decode())


loop = asyncio.new_event_loop()
loop.create_task(make_connections())
loop.run_forever()

版本2适用于单个客户端,但如果我向客户端发送键盘中断,则在重新启动客户端后无法再连接。每当我更改客户机中的代码时,ssh中的ssh和杀死/重新启动服务器都是很烦人的。我不明白为什么第二个版本在第二次尝试连接时不接受客户机。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-06 06:10:52

我不明白为什么server.py版本1允许客户端被键盘中断并重新启动,而server.py版本2不允许

这两个版本都有一个错误,它们没有正确检查文件结束的情况。当您中断客户端时,套接字将关闭并从中读取返回EOF,而向其写入则会引发异常。在版本1中等待writer.drain()传递异常并中断协同机制。(此异常可能显示在服务器的标准错误上。)

但是,Version 2有一个问题:在EOF上,if request == "hello"测试是假的,因为reader.read()一直返回一个空字节字符串来标记EOF条件。这防止了await writer.drain()执行和传递异常,因此协同线仍然被困在无限循环中。一个简单的解决方法是在if not request: break之后添加类似read的内容。

为什么第2版会被卡住

但是,上面的内容并没有完全解释为什么在第2版中,整个服务器出现故障,而新的客户端无法连接。当然,人们会期望await要么返回一个结果,要么将控制权交给其他协同器。但是,观察到的行为是,尽管在await循环中包含了一个while,但coroutine不允许其他协同器运行!

问题是,await并不意味着“向事件循环传递控制”,因为人们经常理解它。它的意思是“来自提供的可访问对象的请求值,如果事件循环对象指示它没有现成的值,则生成对事件循环的控制”。if之后的部分至关重要:如果对象确实有一个就绪值,则将立即使用该值,而不会将其推迟到事件循环。换句话说,await 并不保证事件循环将有机会运行.

EOF上的流总是有要返回的数据--标记EOF的空字符串。因此,它永远不会被挂起,循环最终会完全阻塞事件循环。为了保证其他任务有机会运行,您可以在循环中添加await asyncio.sleep(0) --但是这在正确编写的代码中不应该是必需的,在该代码中,请求IO数据将很快导致等待,此时事件循环将启动。一旦EOF处理错误得到纠正,服务器将正确工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50698649

复制
相关文章
模拟按钮的可访问性
为了创建更加漂亮的按钮,我们在项目实践中经常使用A、SPAN等元素模拟按钮,而不是使用更合语义的input[button]或者button元素。使用这种方法我们可以快速的创建各浏览器表现一致的按钮,免受各种bug困扰,但同时也带来了可访问性问题。
Jace
2018/08/01
8870
WAI-ARIA 可访问性尝试
WAI-ARIA 的全称是 Web Accessibility Initiative – the Accessible Rich Internet Applications Suite。简而言之:我们使用这个标准定义的一些方式,来实现无障碍化,目的是为了让那些残障人士也可以顺利的访问我们的站点。
上山打老虎了
2022/06/15
4350
WAI-ARIA 可访问性尝试
如何提高网站的可访问性?
关于可访问性的错误观念 可访问性影响所有用户,而不仅仅是那些有特定障碍的用户。接受这一点意味着实现可访问性就是建立压力案例。压力案例指的是影响任何一个人的任何医疗或任何情境状况,无论是什么场景时间点。一些常见的压力案例原因是:
lyb-geek
2018/12/11
1.5K0
关于 Web 可访问性的神话
网络可访问性是每个 Web 开发项目中的必去之处,但对于许多 Web 开发人员来说,它似乎仍是个谜。就像这是传奇的东西, 而不是工作所需的基本技能。
OwenZhang
2021/12/08
6680
关于 Web 可访问性的神话
可访问性测试(无障碍测试)
网络是向所有人开放的,作为一个测试者(也是人),我们有责任检查它是否对所有用户开放。反过来,这将为业务的成功做出很大贡献,因为我们努力让每个用户都能访问应用程序。
FunTester
2023/08/04
7800
可访问性测试(无障碍测试)
10步大幅提升网站可访问性
10步大幅提升网站可访问性:1. 检查<title>标签;2. 提供文字替代方案;3. 检查表单;4. 使用heading做信息架构;5. 减少焦点劫持;6. 按Ctrl+或command+查看页面缩放;7. 添加landmark角色;8. 设置快捷键;9. 触发界面转换需设置焦点;10. 填写一个简单的链接到<body>之后作为第一个内容元素。
RP道貌不岸然
2017/11/22
1K0
10步大幅提升网站可访问性
运营数据库系列之可访问性
这篇博客文章是CDP中Cloudera的运营数据库(OpDB)系列文章的一部分。每篇文章都会详细介绍新功能。从该系列的开头开始,请参阅CDP 中的 Operational Database 。
大数据杂货铺
2020/04/21
8730
运营数据库系列之可访问性
提升网站可访问性的CSS实践方法
随着互联网的不断发展,越来越多的人开始依赖于网络,如何让网站更加易于访问、易于阅读是一个至关重要的问题。本文将从多个方面介绍如何使用CSS来提升网站的可访问性。
很酷的站长
2023/10/07
2460
提升网站可访问性的CSS实践方法
.Net6种成员的可访问性
CLR术语 C#术语 描述 Private private 成员只能由定义类型或任何嵌套类型访问 Family protected 成员只能由定义类型,任何嵌套类型或者不管在任何程序集中声明的派生类型访问 Family  and  Assembly 不支持 成员只能由定义类型,任何嵌套类型或者同一程序集中定义的派生类型访问 Assembly internal 成员只能由定义程序集访问 Family or Assembly protected  internal 成员可由定义类型,任何嵌套类型,任何派生类或者
莫问今朝
2018/08/31
5920
10条提高网站可访问性的建议
我们收集了10条提高网站可访问性的建议以保证网站你的网站对任何人都是友好的,包括残疾人。
frontoldman
2019/09/02
1K0
10条提高网站可访问性的建议
如何测试你做的项目的可访问性
编者按:本文作者:安佳,360 搜索事业部的前端开发工程师,W3C CSS 工作组成员。
苏南
2020/12/16
1.9K0
如何测试你做的项目的可访问性
C#2.0新增功能07 getter/setter 单独可访问性
  属性是一种成员,它提供灵活的机制来读取、写入或计算私有字段的值。 属性可用作公共数据成员,但它们实际上是称为访问器的特殊方法。 这使得可以轻松访问数据,还有助于提高方法的安全性和灵活性。
张传宁IT讲堂
2019/09/17
4110
使用 CSS prefers-* 规范,提升网站的可访问性与健壮性
互联网发展到今天,对于我们的前端而言,我们的关注点不应该仅仅是我们产出的页面能不能用,也需要更多的去关注我们的页面好不好用,有没有照顾到更多的用户群体?
Sb_Coco
2021/06/08
6690
使用 CSS prefers-* 规范,提升网站的可访问性与健壮性
如何提高 Web 可访问性,让残障人士拥有更好的体验?
如果你创建了 Web 内容,那么即使从未写过一行代码或登录 CMS,你也可以在可访问性方面发挥作用。
深度学习与Python
2022/11/28
7250
如何提高 Web 可访问性,让残障人士拥有更好的体验?
A11Y(Accessibility 可访问性)的研发投入到底值不值?| GMTC
Accessibility 是指可访问性,很多时候也被人称为无障碍,之前有人一度认为,只要让盲人人士可以正常访问(操作)Web 应用或 Web 网站,那么该应用就具备可访问性,也意味着无障碍设计做得好。但这个认知并不准确,我们通常所说的可访问性,更侧重于对用户的“方便性”的考量,即让尽可能多的人使用你的网站。 Tim Berners-Lee(万维网的发明者和 W3C 主管)曾说过:“Web 的力量在于它的普遍性,每个人不论残疾与否都能访问是一个最基本的方面”。W3C 则将“无障碍(Accessibilit
深度学习与Python
2023/04/01
5390
A11Y(Accessibility 可访问性)的研发投入到底值不值?| GMTC
[译] 世界比以往任何时候都更需要 Web 可访问性
原文地址:https://levelup.gitconnected.com/the-world-needs-web-accessibility-now-more-than-ever-df8dc4aab2b6 原文作者:KBronJohn 译文出自:"掘金翻译计划"(https://github.com/xitu/gold-miner) 本文永久链接:https://github.com/xitu/gold-miner/blob/master/article/2020/the-world-needs-web
江米小枣
2020/09/16
3690
监视器
想了解 synchronized 是如何运行的?就要先搞清楚 synchronized 是如何实现? synchronized 同步锁是通过 JVM 内置的 Monitor 监视器实现的,而监视器又是依赖操作系统的互斥锁 Mutex 实现的,那接下来我们先来了解一下监视器。
磊哥
2022/05/10
8600
监视器
可测性设计DFT
穷举测试向量, 就需要214=16384个测试矢量,对于一个有38个输入端口的16位的ALU来说,以10 MHz的速度运行完所有的测试矢量需要7.64个小时.
数字芯片社区
2022/12/18
1.3K0
可测性设计DFT
Google Fonts 已可正常访问,相关插件可卸
大概9 个月前Google Fonts 所在的googleapis.com 被墙,导致WordPress 后台访问慢(详细点这)。最新的情况是,谷歌官方为Google Fonts在国内解析了个国内ip,因此Google Fonts 在国内已可正常访问,相关插件可以卸掉了。 详情 各位可以ping 下fonts.googleapis.com,在国内解析出:googleadapis-china.1.google.com,对应的203.208.48.136是来自北京市海淀区北京谷翔信息技术有限公司的IP地址——即
Jeff
2018/01/19
2.3K0
Google Fonts 已可正常访问,相关插件可卸
设置 jupyter notebook 可远程访问
默认情况下,安装好 Anaconda 后打开 jupyter notebook, 访问本地 localhost:8888 即可。但是如果要访问另一台机器,比如远端服务器上的 notebook, 即默认是不支持 172.104.105.119:8888 这样的访问,需要额外配置。
用户1558438
2018/08/23
2.3K0

相似问题

如何在cPanel中托管Laravel和Inertiajs (React)应用程序?

14

在单域cpanel中托管多个react应用程序

13

如何在cPanel上托管node react web应用程序?

19

Drupal AEgir托管系统和cPanel

11

NodeJS cPanel托管

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文