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

听起来您在一个线程中调用 close(),而另一个线程正在执行 perform()。幸运的是,图书馆会警告您,而不是陷入未知的行为领域。

您应该只使用来自一个线程的 curl 会话 - 或者在对 perform() 的调用完成时让 perform() 线程以某种方式进行通信。

于 2010-09-24T16:42:07.730 回答
0

您显然展示了 curl 包装类中的一些方法,您需要做的是让对象自己处理。

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

并且不要明确调用关闭。当对象完成它的工作并且对它的所有引用都被删除时,curl 连接将被关闭。

于 2010-11-12T01:42:37.750 回答