如何避免在python中阻塞代码?

如何避免在python中阻塞代码?,第1张

概述我正在玩gevent,我想知道为什么我的代码阻止,我如何解决它. 我有一个绿色的池,并且每个人都和一个节俭的客户端聊天,收集来自远程节俭服务器的数据.为了练习的目的,节俭服务器总是采取> 1s返回任何数据. 当我生成绿色小花并运行连接时,它们并不是并行执行,而是一个接一个地执行.我的理解是,这是因为我的代码是“阻止”,因为当我运行monkey.patch_all()时,所有的绿色小心魔术地并行运行 我正在玩gevent,我想知道为什么我的代码阻止,我如何解决它.

我有一个绿色的池,并且每个人都和一个节俭的客户端聊天,收集来自远程节俭服务器的数据.为了练习的目的,节俭服务器总是采取> 1s返回任何数据.
当我生成绿色小花并运行连接时,它们并不是并行执行,而是一个接一个地执行.我的理解是,这是因为我的代码是“阻止”,因为当我运行monkey.patch_all()时,所有的绿色小心魔术地并行运行.

那么如何使代码不阻挡自己,而不是猴子修补一切,而不理解它在做什么?

一个我不明白的例子:

import timefrom gevent.pool import Pooldef hello():    print 'Hello %d' % time.time()    time.sleep(1) def main():    pool = Pool(5)    for _ in xrange(5):        pool.spawn(hello)    pool.join()if __name__ == '__main__':    main()

产量

Hello 1345477112Hello 1345477113Hello 1345477114Hello 1345477115Hello 1345477116

我知道我可以使用gevent.sleep,但是如何使该函数不会阻塞与常规的time.sleep?

谢谢

解决方法 greenlets从不并行运行,它们都共享相同的进程和相同的线程,所以最多只有一个运行在一个时间.

绿色是绿色的,因为它们是合作(“co”),因此,甚至不能说它们同时运行,因为你需要协调运行. Gevent做的大部分工作都是在幕后的,并且从libevent(或libev)中知道什么样的绿叶可以运行.根本没有抢占.

在您给出的示例中,time.sleep(2)将使进程在 *** 作系统中进行休眠,Gevent的调度程序将不会运行,也不能切换到另一个小样.

所以,关于你的问题:如果你不想猴子修补一个现有的代码,你将不得不手动替换每个阻塞调用到gevent的等效项,这样gevent可以调度调用绿色小程序并选择另一个运行.

编辑:关于在没有猴子补丁的情况下使用节俭的节气:我不知道是否值得.

如果要修改(fork)thrift的库,只需要更改文件TSocket.py,然后更改:

import socket

至:

from gevent import socket

但是,您的储蓄库将依赖于地理位置,如果您更新节俭,您将需要重新应用补丁.

您也可以将TSocket子类化,更改方法open()以使用gevent的套接字,并使用它代替前者,但对我来说似乎更为复杂.

实际上我使用Thrift与Gevent,为了简单起见,我选择了猴子修补整个事情.

总结

以上是内存溢出为你收集整理的如何避免在python中阻塞代码?全部内容,希望文章能够帮你解决如何避免在python中阻塞代码?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1206757.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存