4

私はpycurlを使用してWebサービスのクライアントに取り組んでいます。クライアントはストリーム サービスへの接続を開き、それを別のスレッドに生成します。接続の設定方法を簡略化したバージョンを次に示します。

def _setup_connection(self):
    self.conn = pycurl.Curl()
    self.conn.setopt(pycurl.URL, FILTER_URL)
    self.conn.setopt(pycurl.POST, 1)
    .
    .
    .
    self.conn.setopt(pycurl.HTTPHEADER, headers_list)
    self.conn.setopt(pycurl.WRITEFUNCTION, self.local_callback)

def up(self):
    if self.conn is None:
        self._setup_connection()
    self.perform()

さて、接続をシャットダウンしたいときは、

self.conn.close()

次の例外が発生します。

error: cannot invoke close() - perform() is currently running

これは、ある意味では理にかなっていますが、接続は常に開いています。私は探し回っていますが、この問題を回避して接続をきれいに閉じる方法を見つけることができないようです。

4

2 に答える 2

1

別のスレッドが perform() を実行しているときに、あるスレッドで close() を呼び出しているようです。幸いなことに、ライブラリは、未知の振る舞いに陥るのではなく、警告を出します。

1 つのスレッドからのみ curl セッションを使用する必要があります。または、perform() の呼び出しが完了したときに perform() スレッドに何らかの方法で通信させる必要があります。

于 2010-09-24T16:42:07.730 に答える
0

明らかに、curl ラッパー クラスのいくつかのメソッドを示しました。必要なことは、オブジェクトがそれ自体を処理できるようにすることです。

def __del__(self):
    self.conn.close()

クロージングを明示的に呼び出さないでください。オブジェクトがジョブを終了し、オブジェクトへのすべての参照が削除されると、curl 接続が閉じられます。

于 2010-11-12T01:42:37.750 に答える