0

つまり、CherryPy が同じリソースに対して 2 つの requeste を同時に取得するとどうなるか、変数が混在しているのか、それとも何が起こっているのかわかりません。

この問題があります。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 リクエストを作成すると、必要なものが得られますが、ページの読み込み時に 2 つの GET リクエストを Web サービスに送信する Web ページを作成すると、2 番目のリクエストはほとんどの場合、次のようなエラーで失敗します。

ProgrammingError: Attempt to use a closed cursor.

または他の時:

ProgrammingError: No results.  Previous SQL was not a query

では、何が起こっているのですか?私のリクエストは、同時に実行される同じ変数を共有していますか? 一度に 1 つのリクエストのみを処理するように CherryPy を設定できますか?

4

1 に答える 1

2

@DanielRoseman が気付いたように、変数を on に設定しないでくださいself。クラスのインスタンスを 1 つだけ作成しgetCustomersたため、CherryPy はGET複数のスレッドから同じインスタンスのメソッドを呼び出します (リクエストを処理するスレッド プールがあります)。したがって、

self.cursor = self.cnxn.cursor()

はスレッドセーフではなく、最終的に別のカーソルが表示されます

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

またはself.cursor.fetchall()または他の場所 (少しランダムです)。

ただし、すべての変数をローカルに変更すると ( ではまったく使用selfしないでGETください)、問題が解決するはずです。

于 2013-08-22T10:36:07.887 に答える