0

简而言之,我不明白 CherryPy 同时向同一资源获取两个请求会发生什么,是变量混合还是发生了什么?

我有这个问题,我正在尝试使用 Python 2.7 和 CherryPy 3.2.2 创建一个非常基本的 Web 服务。

Web 服务由前端使用,它使用 jquery/ajax 向 Web 服务发出 ajax 请求。

现在,我创建了一个 CherryPy 程序,并且正在使用它的内置 wsgi 服务器。我有这样的 CherryPy 配置:

conf = {
    'global': {
        'server.socket_host': '127.0.0.1',
        'server.socket_port': 8000,
    },
    '/': {
        'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
    }
}
cherrypy.quickstart(root, '/', conf)

然后我有:

root.customers = getCustomers()

和这个的实际类:

class getCustomers(object):

    def __init__(self):
        pass

    exposed = True

    def GET(self,callback,**kwargs):
        self.callback = callback
        self.cnxn= pyodbc.connect(constr)
        self.cursor = self.cnxn.cursor()

        cherrypy.response.headers['Content-Type']='application/json'
        self.cursor.execute("""select * from customers
            """, self.job_worknumber)
        self.customers = self.cursor.fetchall()

        self.objects_list = []
        for c in self.customers
            r = collections.OrderedDict()
            r['customer_id'] = c.customer_id
            r['customer_name'] = c.customer_name
            self.objects_list.append(r)

        self.cursor.close()
        self.cnxn.close()

        self.w = collections.OrderedDict()
        self.w['data1'] = self.objects_list
        #w['errors'] = 'error'
        self.j = json.dumps(self.w)

        #cursor2.close()
        return  self.callback+'('+self.j+');'

现在,当我创建一个 GET 请求时,我得到了我想要的,但是如果我创建在页面加载时向 Web 服务发送两个 GET 请求的网页,第二个请求几乎总是会失败,并出现如下错误:

ProgrammingError: Attempt to use a closed cursor.

或其他时间:

ProgrammingError: No results.  Previous SQL was not a query

那么发生了什么,我的请求是否在同时运行时共享相同的变量?我可以将 CherryPy 配置为一次只处理一个请求吗?

4

1 回答 1

2

正如@DanielRoseman 注意到的那样,您不应该在self. 您只创建了一个getCustomers类实例,因此 CherryPyGET将从多个线程调用同一实例上的方法(有一个处理请求的线程池)。因此使用

self.cursor = self.cnxn.cursor()

不是线程安全的,你最终会得到不同的光标

self.cursor.execute("""select * from customers
            """, self.job_worknumber)

self.cursor.fetchall()或在任何其他地方(有点随机)。

但是,将所有变量更改为本地变量(根本不要使用selfin GET)应该可以解决问题。

于 2013-08-22T10:36:07.887 回答