python asyncio 无法同时运行两个无限函数

2023-12-07

我一直在尝试同时运行两个功能,但一个功能似乎永远无法工作,除非我停止另一个功能。第一个函数每 30 秒发送一封电子邮件,而第二个函数每 5 秒打印一条简单的语句。组合起来,每 6 个“Hello Worlds”输出应发送一封电子邮件。

然而,我从来没有收到过电子邮件,除非将打印更改为提前停止,例如 10 秒后结束。我该怎么做才能让两者同时运行而不停止?

async def timer():
    end = time.time() + 30
    while True:
        if time.time() >= end:
            sendmail(name, filepath + "\\" + name, receiver)
            end = time.time() + 30

async def runs():
    while True:
        print("Hello World")
        time.sleep(5)


loop = asyncio.get_event_loop()
loop.create_task(runs())
loop.create_task(timer())
loop.run_forever()

蟒蛇的async协程的目的是合作社并发。这意味着协程必须主动允许其他协程运行。对于简单的情况,使用await asyncio.sleep暂停当前​​协程并运行其他协程。

async def timer():
    while True:
        await asyncio.sleep(30)  # instead of `if time.time() >= end:…`
        sendmail(name, filepath + "\\" + name, receiver)

async def runs():
    while True:
        print("Hello World")
        await asyncio.sleep(5)  # instead of `time.sleep(5)`

async def main():
    await asyncio.gather(timer(), runs())

asyncio.run(main())

值得注意的是,不要使用time.sleep– 这会阻塞整个线程,意味着当前的协程以及事件循环和所有其他协程,直到睡眠结束。
同样,避免任何运行时间较长的同步代码 –asyncio同步代码运行时无法切换到其他协程。如果需要,请使用asyncio在线程中运行同步代码的帮助程序,例如asyncio.to_thread or loop.run_in_executor.

async def timer():
    next_run = time.time()
    while True:
        # run blocking function in thread to keep event-loop free
        await asyncio.to_thread(
            sendmail, name, filepath + "\\" + name, receiver
        )
        # pause to run approx every 30 seconds
        await asyncio.sleep(next_run - time.time())
        next_run += 30
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python asyncio 无法同时运行两个无限函数 的相关文章

随机推荐

  • jQuery CSS 悬停

    我有一个 CSS 菜单 当鼠标悬停在它上面时设置父 li 的颜色 它是子 ul 子菜单 基本上 当您将鼠标悬停在菜单上时 它会改变颜色并保持这种状态 直到您将鼠标移开菜单及其子菜单 看起来很好 我添加了一些 jQuery 代码来更改菜单项的
  • 如何让一个视图知道另一个视图的变化?

    假设您正在制作一个音乐库应用程序 您有一个包含流派列表的视图 另一个显示所选流派的内容 当用户单击列表上的流派时 其他视图中的内容应相应更新 为了最大限度地减少依赖性 最好的方法是什么 除了绘制各个流派的视图之外 我还没有找到任何其他地方可
  • Java数组的克隆方法

    Java 中的 clone 方法在数组上使用时到底返回什么 它是否返回一个新数组 其中包含从原始数组复制的数据 Ex int a 1 2 3 int b a clone 当 的时候clone方法在数组上调用 它返回对新数组的引用 该新数组包
  • 如何找到 PIE 二进制文件的加载重定位?

    我需要获取正在运行的进程中堆栈的基地址 这将使我能够打印 addr2line 可以理解的原始堆栈跟踪 运行的二进制文件被剥离 但 addr2line 可以访问符号 我设法通过检查 elf header 来做到这一点argv 0 我读取入口点
  • Rails 进程的互斥体

    通过 Passenger 或 Mongrel 部署 Rails 时 您会运行多个应用程序实例 在共享资源上建立互斥锁的最佳实践或模式是什么 例如写入本地文件或远程文件 我想确保两个进程不会同时写入同一资源 如果您只是需要防止多个编写者同时处
  • ASP.NET 中的带宽监控

    您好 我们正在 Asp Net 中开发一个多租户应用程序 每个租户都有单独的数据库 其中要求之一是监视每个租户的带宽使用情况 我尝试搜索 但没有找到有关该主题的太多帮助 我们希望准确监控每个租户使用了多少带宽 而每个租户可以拥有自己的顶级域
  • 在循环/foreach MVC 视图中动态生成表

    我现在正在编写一些非常糟糕的代码 在保存之前 我希望得到一些关于改进它的意见 我正在尝试构建一个每行三个单元格的 html 表格 如果集合有 5 个项目 则应呈现为两行 到目前为止我所写的代码不是很健壮 需要不断维护 但我不确定是否有其他工
  • PHP 脚本未在浏览器上运行

    我已经在我的系统上安装了 XAMPP 服务器以便能够使用 PHP 但是安装后 当我在浏览器上运行任何 php 脚本时 它不会运行 我没有看到任何输出 没有从本地主机检查 phpinfo 我看到版本 5 3 5 已安装 即使运行一个简单的 p
  • 正则表达式如何在任何地方排除特定字符或字符串[重复]

    这个问题在这里已经有答案了 the cat sat on the mat 假设这些是不同的条目 从您要搜索的内容中的任何位置排除特定字符 在本例中为 a 的正则表达式是什么 所以你会得到的点击是 the on the 或者如果它是一个单词
  • 在请求中传递标头的效果?

    我想知道当你传递标题时会有什么不同requests get即之间的差异requests get url headers and requests get url 我有这两段代码 from lxml import html from lxml
  • 我的 Spring Security 应用程序不会超出登录页面

    我刚刚启动了一个使用 Spring Security 进行身份验证的项目 该项目使用 Java 配置而不是 XML 这是我的 SecurityConfig java 类 Configuration EnableWebSecurity pub
  • 将 .txt 文件中的双精度数读入双精度数组 C++

    我正在尝试创建一个需要大量股票价格的程序 我将这些价格存储在 txt 文件中 每行一个双精度 数量未知 可能有数千 我无法将数据放入我可以操作的数组中 我已经几个小时无法解决这个问题了 每当我尝试从文件中读取数据然后将其转换为双精度时 我都
  • 使用 babel ES6 创建注释

    我实际上正在使用 babeljs 和 ES6 带有 js 文件 开发一个应用程序 我想知道是否可以创建注释 就像我们可以使用 typescript 一样 使用 babeljs 和 ES6 JavaScript 没有与 TypeScript
  • 来自用户输入的Python调用函数[重复]

    这个问题在这里已经有答案了 可以根据用户输入调用函数吗 像这样的东西 def testfunction function function a raw input fill in function name testfunction a 因
  • 如何确认多个 AJAX 调用已完成?

    document ready function list1 jqGrid url example1 php balabala gridComplete function list2 jqGrid url example2 php balab
  • 如何在 JMeter 中将变量从一个线程组传递到另一个线程组

    我有一个包含 2 个线程组的 JMeter 测试 第一个是单个线程 创建一些库存 第二个有多个线程 购买所有库存 我使用 BeanShell Assertions 和 XPath Extractors 来解析返回值 XML 并存储变量 例如
  • 删除 datagridview 标题中的排序箭头并将文本放在框的中心

    我正在开发一个项目 需要标题文本位于中心 当单击标题时它将进行排序 但问题是 有一个排序箭头图标 即使它没有显示 它也会将文本推到左侧 我想要实现的是 删除排序箭头并将文本置于中心但仍保留排序功能 p s 我尝试处理单元格事件绘制并重新绘制
  • 替换字符串中特定索引处的字符?

    我正在尝试替换字符串中特定索引处的字符 我正在做的是 String myName domanokz myName charAt 4 x 这会产生错误 有什么方法可以做到这一点吗 Java 中的字符串是不可变的 你无法改变它们 您需要创建一个
  • Java枚举和迭代器的区别

    这两个接口的具体区别是什么 做Enumeration比使用有好处Iterator 如果有人能详细说明 参考文章将不胜感激 查看 Java API 规范Iterator界面上 有关于之间差异的解释Enumeration 迭代器不同于 枚举有两
  • python asyncio 无法同时运行两个无限函数

    我一直在尝试同时运行两个功能 但一个功能似乎永远无法工作 除非我停止另一个功能 第一个函数每 30 秒发送一封电子邮件 而第二个函数每 5 秒打印一条简单的语句 组合起来 每 6 个 Hello Worlds 输出应发送一封电子邮件 然而