无法关闭用pycurl打开的流
我正在用pycurl开发一个网页服务的客户端。这个客户端会打开一个流服务的连接,并把它放到一个单独的线程里。下面是连接设置的简化版本:
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
这在某种程度上是可以理解的,因为连接一直是打开的。我一直在寻找解决这个问题的方法,但似乎找不到任何可以干净地关闭连接的办法。
2 个回答
1
听起来你是在一个线程中调用close(),而另一个线程正在执行perform()。幸运的是,这个库会给你警告,而不是让你陷入一些不可预知的错误中。
你应该只在一个线程中使用curl会话,或者让执行perform()的线程以某种方式通知你,当perform()调用完成时。
0
你显然展示了一些来自curl封装类的方法,接下来你需要做的是让这个对象自己处理事情。
def __del__(self):
self.conn.close()
而且不要显式地调用关闭连接。当这个对象完成了它的工作,并且所有指向它的引用都被移除后,curl连接就会自动关闭。