草庐IT

Python 等待数据进入 sys.stdin

coder 2023-08-14 原文

我的问题如下:

我的 pythons 脚本通过 sys.stdin 接收数据,但它需要等到新数据在 sys.stdin 上可用。

如 python 的联机帮助页中所述,我使用以下代码,但它完全使我的 cpu 重载。

#!/usr/bin/python -u
import sys
while 1:
     for line in sys.stdin.readlines():
         do something useful

有什么好的方法可以解决cpu占用率高的问题吗?

编辑:

您所有的解决方案都行不通。 我给你我的问题。

您可以配置 apache2 守护进程,他将每个日志行发送到程序而不写入日志文件。

这看起来像这样:

CustomLog "|/usr/bin/python -u /usr/local/bin/client.py" combined

Apache2 期望我的脚本始终运行,等待 sys.stdin 上的数据并解析它然后有数据。

如果我只使用 for 循环,脚本将退出,因为在某个时候 sys.stdin 中没有数据,apache2 会说哦,你的脚本意外退出了。

如果我使用 while true 循环,我的脚本将使用 100% 的 CPU 使用率。

最佳答案

以下内容应该可以正常工作。

import sys
for line in sys.stdin:
    # whatever

理由:

代码将在标准输入输入时遍历行。如果流仍然打开,但没有完整的行,则循环将挂起,直到遇到换行符(并返回整行)或者流被关闭(缓冲区中剩余的内容将被返回)。

一旦流被关闭,就不能再向标准输入写入数据或从标准输入读取数据。期间。

您的代码使您的 CPU 重载的原因是一旦标准输入被关闭,任何后续的迭代标准输入的尝试将立即返回而不做任何事情。本质上,您的代码等同于以下内容。

for line in sys.stdin:
    # do something

while 1:
    pass # infinite loop, very CPU intensive

如果您发布您是如何将数据写入标准输入的,也许它会很有用。

编辑:

Python 将(出于 for 循环、迭代器和 readlines() 的目的)在遇到 EOF 字符时考虑关闭流。您可以要求 python 在这之后读取更多数据,但您不能使用之前的任何方法。 python手册页推荐使用

import sys
while True:
    line = sys.stdin.readline()
    # do something with line

当遇到 EOF 字符时,readline 将返回一个空字符串。如果流仍然打开,对 readline 的下一次调用将正常运行。您可以通过在终端中运行命令来自行测试。按 ctrl+D 将导致终端将 EOF 字符写入标准输入。这将导致本文中的第一个程序终止,但最后一个程序将继续读取数据,直到流真正关闭。最后一个程序不应该 100% 使用您的 CPU,因为 readline 将等待直到有数据返回而不是返回空字符串。

当我尝试从实际文件读取行时,我只会遇到忙循环的问题。但是当从 stdin 读取时,readline 很乐意阻塞。

关于Python 等待数据进入 sys.stdin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7056306/

有关Python 等待数据进入 sys.stdin的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  5. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  6. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  7. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  8. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

随机推荐