多进程xmlrpc服务器(附:多线程xmlrpc服务器)

本文详细介绍了如何在项目开发中遇到线程间共享静态变量导致错误时,转而使用多进程服务器解决的方法。通过提供Python 2.7环境下多进程XMLRPC服务器的代码实现,对比了多进程与多线程服务器的差异,并通过实例演示了如何注册响应方法。此教程旨在帮助开发者理解并应用多进程技术提高服务器性能。

创建多进程服务器:在项目开发中 开始使用多线程服务器,响应客户端请求,由于服务器端调用的函数操作使用了静态变量(线程间共享)导致错误,没有办法只有考虑使用多进程服务器。

多进程和多线程服务器很类似,只是继承的类不同。

多进程xmlrpc服务器代码(python2.7)如下:

# This Python file uses the following encoding: utf-8
'''
Created on May 28, 2015

@author: root
'''
try:
    import fcntl
except ImportError:
    fcntl = None
from SimpleXMLRPCServer import SimpleXMLRPCDispatcher,SimpleXMLRPCRequestHandler
from SocketServer import ForkingTCPServer
class XmlRPCForkServer(ForkingTCPServer,
                         SimpleXMLRPCDispatcher):
    allow_reuse_address = True
    _send_traceback_header = False

    def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
                 logRequests=True, allow_none=False, encoding=None, bind_and_activate=True):
        self.logRequests = logRequests

        SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
        ForkingTCPServer.__init__(self, addr, requestHandler, bind_and_activate)

        if fcntl is not None and hasattr(fcntl, 'FD_CLOEXEC'):
            flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD)
            flags |= fcntl.FD_CLOEXEC
            fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags)
            
server=XmlRPCForkServer(("",8080),SimpleXMLRPCRequestHandler,True)

def add(a, b): #这个响应方法含有参数
    import time
    time.sleep(20)
    return a + b

def multi(a, b): #这个响应方法含有参数
#     time.sleep(10)
    return a * b
server.register_function(add,'add') 
server.register_function(multi,'multi') 

server.serve_forever()


附: 多线程xmlrpc服务器代码(python2.7 ):

# This Python file uses the following encoding: utf-8
'''
Created on May 28, 2015

@author: root
'''
try:
    import fcntl
except ImportError:
    fcntl = None
from SimpleXMLRPCServer import SimpleXMLRPCDispatcher,SimpleXMLRPCRequestHandler
from SocketServer import ThreadingTCPServer
class XmlRPCThreadingServer(ThreadingTCPServer,
                         SimpleXMLRPCDispatcher):


    allow_reuse_address = True


    _send_traceback_header = False

    def __init__(self, addr, requestHandler=SimpleXMLRPCRequestHandler,
                 logRequests=True, allow_none=False, encoding=None, bind_and_activate=True):
        self.logRequests = logRequests

        SimpleXMLRPCDispatcher.__init__(self, allow_none, encoding)
        ThreadingTCPServer.__init__(self, addr, requestHandler, bind_and_activate)

        if fcntl is not None and hasattr(fcntl, 'FD_CLOEXEC'):
            flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD)
            flags |= fcntl.FD_CLOEXEC
            fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags)
            
server=XmlRPCThreadingServer(("",8080),SimpleXMLRPCRequestHandler,True)

def add(a, b): #这个响应方法含有参数
    import time
    time.sleep(20)
    return a + b

def multi(a, b): #这个响应方法含有参数
#     time.sleep(10)
    return a * b
server.register_function(add,'add') 
server.register_function(multi,'multi') 

server.serve_forever()







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值