【问题标题】:Can logging or print methods switch greenlets?记录或打印方法可以切换greenlets吗?
【发布时间】:2013-09-04 16:49:09
【问题描述】:

我还是 greenlets 和 gevent 的新手,但据我了解,greenlets 在显式的 yield 语句或阻塞 I/O 操作上屈服于其他 greenlets。但是使用 print 语句写入标准输出会阻塞吗?那么使用 logging 模块写入 stdout、stderr 或本地磁盘或 NFS 上的文件呢?

对 print 语句或日志记录方法的调用会导致 greenlet 切换吗?

【问题讨论】:

  • greenlet 本身永远不会隐式产生。 gevent 可能会修补许多标准库对象以获得这种效果(但我不能这样说,所以这只是一个评论,而不是一个答案:-)。
  • gevent 确实有一个猴子补丁操作,可以将某些模块替换为在阻塞 IO 调用时让给其他 greenlet 的版本(例如 gevent.socket)。然后我想知道的是,gevent.monkey.patch_all 是否会将日志记录模块使用的任何功能替换为其他greenlets的版本?

标签: python gevent greenlets


【解决方案1】:

print 语句总是阻塞的,不会切换到其他 greenlets。避免在任何 Gevent 服务器代码中打印指令。

较新的 Gevent 版本具有异步文件 I/O gevent.os.tp_read,可与日志记录模块一起使用以实现非阻塞操作。在这种情况下,日志语句会导致 Greenlet 上下文切换。

【讨论】:

  • 这让我很惊讶,因为据我所知,阻塞操作会导致切换到其他 greenlets。
  • @RelationRelatesItselfToItself 异步操作导致切换。找出答案的最简单方法是进行实验。 time.sleep() 是阻塞函数(不打补丁),gevent.sleep() 是异步函数。
  • 好消息!如果您无法对日志记录模块进行猴子补丁,您也可以使用 get_hub().threadpool.spawn 来运行您的日志记录语句。这将在 gevent 的默认操作系统线程池上运行您的函数。很方便。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2011-02-17
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
相关资源
最近更新 更多