使用GEVENT与Python的xmlrpclib
题
是否可以使用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为每个新连接。
不隶属于 StackOverflow