是否有可能阻止python';当没有数据时,是否阻止挂起http.client.HTTPResponse.read()?
我正在使用Python是否有可能阻止python';当没有数据时,是否阻止挂起http.client.HTTPResponse.read()?,python,multithreading,twitter,Python,Multithreading,Twitter,我正在使用Pythonhttp.client.HTTPResponse.read()从流中读取数据。也就是说,服务器将永远保持连接打开,并在数据可用时定期发送数据。没有预期的响应长度。特别是,我通过网络收到推特 为了实现这一点,我反复调用http.client.HTTPResponse.read(1)以获得响应,每次一个字节。问题是,如果没有数据可读取,程序将挂起该行,而在很长一段时间内(当没有tweet传入时)没有数据可读取 我正在寻找一种方法,如果可用,它将获得HTTP响应的单个字节,但如果
http.client.HTTPResponse.read()
从流中读取数据。也就是说,服务器将永远保持连接打开,并在数据可用时定期发送数据。没有预期的响应长度。特别是,我通过网络收到推特
为了实现这一点,我反复调用http.client.HTTPResponse.read(1)以获得响应,每次一个字节。问题是,如果没有数据可读取,程序将挂起该行,而在很长一段时间内(当没有tweet传入时)没有数据可读取
我正在寻找一种方法,如果可用,它将获得HTTP响应的单个字节,但如果没有数据可读取,它将立即失败。
我知道,但是在连接上设置一个超时会破坏让它长时间打开等待数据进入的整个目的。我不想设置超时,我想在有数据要读取时读取数据,或者在没有数据时读取失败,而根本不需要等待
我想用我现在拥有的东西(使用http.client
)来实现这一点,但如果绝对有必要使用不同的库来实现这一点,那就这样吧。我试图完全由我自己编写,因此建议我使用其他人已经编写的用于Python的Twitter API并不是我想要的
此代码获取响应,它在与主线程不同的单独线程中运行:
while True:
try:
readByte = dc.request.read(1)
except:
readByte = []
if len(byte) != 0:
dc.responseLock.acquire()
dc.response = dc.response + chr(byte[0])
dc.responseLock.release()
请注意,请求存储在dc.request
中,响应存储在dc.response
中,这些都是在别处创建的dc.responseLock
是一个锁
,它防止多个线程同时访问dc.response
通过在单独的线程上运行,主线程可以获得dc.response
,其中包含迄今为止收到的整个响应。新数据在不阻塞主线程的情况下添加到dc.response
当它运行时,这项功能非常有效,但当我希望它停止时,我遇到了一个问题。我将while语句更改为而不是dc.twitterAbort
,因此当我要中止此线程时,我只需将dc.twitterAbort
设置为True
,线程将停止
但事实并非如此。该线程在之后保留了很长时间,卡在dc.request.read(1)
部分。必须有某种超时,因为它最终返回到while
语句并停止线程,但这需要大约10秒的时间
如果线程在调用read()
时被卡住,如何让线程在需要时立即停止
同样,此方法用于获取tweet,问题只在于如何使其停止。如果我完全走错了方向,请随意为我指出正确的方向。我是Python新手,所以我可能忽略了一些更简单的方法。您的想法并不新鲜,有一些操作系统机制(*)可以确保应用程序只在保证不阻塞的情况下调用与I/O相关的系统调用。这些机制通常由异步I/O框架使用,如tornado或gevent。使用其中之一,您会发现在应用程序等待I/O事件(例如等待套接字上的传入数据)时运行代码非常容易 如果使用gevent的monkey补丁方法,则可以根据请求使用http.client继续。您只需要习惯gevent/greenlets引入的协作调度范式,在这种范式中,您的执行流在子例程之间“跳跃” 当然,您也可以在另一个线程中执行阻塞I/O(就像您所做的那样),这样就不会影响主线程的响应。关于您的“如何让我的线程立即停止”问题:
- 强制在系统调用中阻塞的线程停止通常不是一个干净甚至无效的进程(另请参阅)。或者——如果您的应用程序已经完成了它的任务——您关闭了整个进程,这也会影响到所有包含的线程,或者您只需保留线程,并根据需要给它尽可能多的时间来终止(您所指的这10秒不是问题,是吗?)
- 如果您不希望在应用程序中的任何地方(无论是否在主线程中)有如此长的阻塞系统调用,那么使用上述技术来防止阻塞系统调用