私たちは小さなcサーバアプリケーションを開発しています。サーバーアプリケーションは、何らかのデータ処理を行い、クライアントに応答します。データ処理部分を構成可能かつ柔軟に保つために、私たちはスクリプト作成に移り、Pythonのために用意された様々な準備モジュールの利用可能性に基づいて、私たちはPython-C APIを使って、cとpythonの間でデータを送受信しています。Python-C APIの並行性の問題
ザ・アルゴリズムは次のように動作します: -
- サーバーがクライアントからいくつかのデータを受け取り、このデータは、Cで作成した辞書に格納されています。辞書はAPI関数PyDict_New()を使用して作成されます。 cから。入力は、PyDict_SetItemString()API関数を使用して辞書にキー値のペアとして格納されます。
- 次にPythonスクリプトPyRun_SimpleString()を実行します。スクリプトをパラメータとして渡します。このスクリプトは、cで作成した辞書を使用します。 cで作成した辞書を、PyImport_AddModule()メソッドを使用してスクリプトにアクセスできるようにします。 PyModule_AddObject();
- 上記で作成した同じ辞書に、データ処理の結果をキー値のペアとしてスクリプトに格納します。 cコードは、スクリプトの実行後に結果変数(キーと値のペア)に簡単にアクセスできます。
問題 我々が直面している問題は、異なるクライアントから来る同時要求の場合です。異なるクライアントから複数のリクエストが入った場合、我々は参照カウントの例外を処理する傾向があります。ユーザーに提供されるリクエストごとに、そのユーザーのみの独立した辞書を作成することに注意してください。この問題を克服するために、PyRun_SimpleString()を呼び出しました。 PyEval_AcquireLock()内; PyEval_ReleaseLock();)を実行すると、スクリプトの実行がブロッキング呼び出しになりました。したがって、スクリプトの実行に時間がかかる場合、他のすべてのユーザーも応答を待っています。
可能な限り最良の方法を提案したり、間違っている箇所を指摘してください。詳細は私にpingしてください。
ご迷惑をおかけして申し訳ありません。
参考までに感謝します。ちなみに、私はそれらの関数を呼び出しましたが、それでも動作しません。 – Will