gpt4 book ai didi

python - 将 gevent 与 python xmlrpclib 一起使用

转载 作者:太空狗 更新时间:2023-10-30 02:06:22 25 4
gpt4 key购买 nike

是否可以将 python 的标准库 xmlrpclib 与 gevent 一起使用?目前我尝试使用 monkey.patch_all(),但没有成功。

from gevent import monkey
monkey.patch_all()

import gevent

import time

import xmlrpclib
from SimpleXMLRPCServer import SimpleXMLRPCServer

import urllib2

def fetch(url):
g = gevent.spawn(urllib2.urlopen, url)
return g.get().read()
def is_even(n):
return n%2 == 0

def req(url):
return fetch(url)

server = SimpleXMLRPCServer(("localhost", 8000))
print "Listening on port 8000..."
server.register_function(is_even, "is_even")
server.register_function(req, "req")
server.serve_forever()

urllib2.urlopen 正在阻塞服务器。在我看来,monkey.patch_all 没有修补套接字,这就是它阻塞的原因。

最佳答案

套接字打好了补丁,但是您的代码还有其他问题。

首先是这个

def fetch(url):
g = gevent.spawn(urllib2.urlopen, url)
return g.get().read()

相同
def fetch(url):
return urllib2.urlopen(url).read()

您在这里生成了一个新的 greenlet,但随后阻塞了当前的 greenlet,直到新的 greenlet 完成。它不会使事情并发。这与运行 urlopen 并等待它完成完全相同。

二、为了利用gevent必须同时运行不止一个轻量级线程 (greenlet)。

然而,SimpleXMLRPCServer 被定义为

class SimpleXMLRPCServer(SocketServer.TCPServer,
SimpleXMLRPCDispatcher):

这意味着它一次服务一个连接。

如果您创建自己的 SimpleXMLRPCServer 类,但使用 ThreadingTCPServer 而不是 TCPServer,您应该能够从此处使用 gevent 中获益。

monkey.patch_all()修补 threading 使其成为基于 greenlet 的,因此这样的服务器将为每个新连接生成一个新的 greenlet。

关于python - 将 gevent 与 python xmlrpclib 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4065079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com