是否可以使用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但随后阻塞当前一个,直到新的做。它不会使事情并发。这是完全一样,只是运行的urlopen并等待它完成。

其次,为了利用 GEVENT 有必须是一个以上的轻质螺纹(greenlet)在同一时间运行。

SimpleXMLRPCServer,它然而,被定义为

class SimpleXMLRPCServer(SocketServer.TCPServer,
                         SimpleXMLRPCDispatcher):

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

如果你让你自己SimpleXMLRPCServer类,但使用ThreadingTCPServer代替TCPServer,你应该能够受益于这里使用GEVENT。

monkey.patch_all() 补丁threading成为greenlet为主,所以这样的服务器将生成一个新的greenlet为每个新连接。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top