一直在用 multiprocessing 和 threading ,遇到内存、资源消耗等问题,想要用gevent.spawn()
改写。
我的主进程是一个 rpc 服务器(不能被阻塞),我只想要异步执行一段代码,不想要结果(代码片段会调用 client 通知结果给主进程), 如果用join 会阻塞。
看了一篇文章 http://www.jianshu.com/p/571db0eb95f8 作者说道:
我在 Python shell 中 gevent.spawn 一个函数,它怎么不运行? 按照自然的思维就是 spawn 后就应该要运行啊。 Erlang 就是这样的
为什么 spawn 出的协程要 join ,一调用 join 就会把整个 python process 阻塞住。丝毫感觉不到异步啊。
在学习两次失败后,后来终于想明白了:
shell 中 spawn 不运行,是因为 gevent 的 event loop 没有跑起来,无法去调度 greenlet 。
join 就是在启动 gevent 的 gevent loop ,一旦 gevent loop 通过其他方式启动起来了, 那么就可以在程序中自然的 spawn 进程。新 spawn 的 greenlet 会被调度执行。
当跨过这个障碍后,学习和使用 Gevent 容易了很多。
很想知道怎样启动 gevent loop ,可以让我新的 spawn 自动异步运行? 尝试了以下代码
gevent.spawn(task)
gevent.sleep(0)
可以跑通,但是 task 函数内如果有 gevent.sleep(2), grequest 之类的语句,就会出现跑一半不跑了的情况,觉得不靠谱会这样那样的意外,因为我没有办法干涉 task 函数。
这让我感觉到 gevent 在 python 大型应用程序的使用率应该很低,要么全部都用,要么全部都不能用,大部分团队多半会选择后者。
想的有点多了,不知道是不是这样呢
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.