首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结合使用gevent和python xmlrpclib

结合使用gevent和python xmlrpclib
EN

Stack Overflow用户
提问于 2010-11-01 05:00:06
回答 1查看 2.1K关注 0票数 4

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

代码语言:javascript
复制
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没有修补套接字,这就是它阻塞的原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-01 11:50:47

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

首先,这是

代码语言:javascript
复制
def fetch(url):
    g = gevent.spawn(urllib2.urlopen, url)
    return g.get().read()

等同于

代码语言:javascript
复制
def fetch(url):
    return urllib2.urlopen(url).read()

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

其次,为了利用gevent,必须同时运行多个轻量级线程(greenlet)。

然而,SimpleXMLRPCServer被定义为

代码语言:javascript
复制
class SimpleXMLRPCServer(SocketServer.TCPServer,
                         SimpleXMLRPCDispatcher):

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

如果您创建了自己的SimpleXMLRPCServer类,但使用的是ThreadingTCPServer而不是TCPServer,那么您应该能够从这里使用gevent中受益。

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4065079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档