- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在我看来,线程无缘无故地突然停止执行,并且再也不会恢复或重新启动。这种行为的可能原因是什么?不会抛出异常。至少没有检测到或打印异常。它只是在没有任何信息的情况下停止。我的 pygtk GUI 和其他一切继续运行没有问题。
它仅限于一段代码,但它发生在该段内的任何地方。以下代码在该线程内运行。我在我的代码中插入了很多打印件,因为我无法调试它。调试器也卡住了。并且在没有调试器的情况下运行不会改变它(所以它不是调试的一些副作用)
count = 0
while True:
count = count + 1
#read results calculated by another thread. Done via Queue.Queue
pos, phrase, site, extractor, infoextractor, image = self.htmlqueue.get(True)
print "\"", threading.currentThread(), "\"", site, image["link"], infoextractor.__class__.__name__ , FileDownloader.nbdownloads, count
print "1"
#if Nones are found in the queue it means that there will be no more data
if pos is None and phrase is None and site is None and extractor is None and infoextractor is None and image is None: break
print "2"
if printstuff: print "preDownloadAll1", image["link"],
print "3"
try:
info = infoextractor.extractValues()
print info
except (object) as e:
print "exception!"
print "5"
if info is None:
print "_5.1_"
continue
print "6"
if len(info) == 0:
print "_6.1_"
continue
print "7"
if "google" in site:
print "8"
adr = image["smallthumb"]
filename = ImageManager.extractFileFromURL(image["smallthumb"])
elif info.has_key("thumb"):
print "9"
adr = info["thumb"]
filename = ImageManager.extractFileFromURL(info["thumb"])
else:
print "10"
adr = image["thumb"]
filename = ImageManager.extractFileFromURL(image["thumb"])
print "11"
localfile = self.imagelocations[site] + "/" + filename
print "12"
t = None
if (not os.path.isfile(localfile)) and predownloadjpegs:
print "13"
t = FileDownloader.downloadFileNewThread(url = adr, localtargetdir = self.imagelocations[site], timetofinish = 100)
print "14"
tds.append((t, pos, phrase, site, extractor, infoextractor, image, info, adr, localfile))
print "15"
if count%100 == 0: print count, "\n"
print "16"
# seen[image["link"]] = True
print "17"
代码平均运行大约 3000-5000 次计数,并在不同的队列条目处停止(大部分 html 已缓存 ;))。挂起前的最后输出 是随机的(每次我重新启动我的应用程序时它都不同)。大多数时候是 3,有时是 16。永远不会达到 17。我也有一个 7。另一次它打印了信息,但它不再打印 5。还有一次它打印了一半的信息字符串。
因为大部分时间是 3,我怀疑那里有异常,也许是一些非常奇怪的延迟检测。但不是!打印“异常!”在我的测试期间从未执行过。
我的线程在卡住后仍保留在内存中并且不会阻塞
self.htmlqueue.get(True)
因为如果我这样做
pos, phrase, site, extractor, infoextractor, image = None, None, None, None, None, None
success = False
while not success:
try:
pos, phrase, site, extractor, infoextractor, image = self.htmlqueue.get(True,10)
success = True
except:
print "no success", count
success = False
然后卡住继续,在大多数运行中根本没有“不成功”的输出。更糟糕的是,我使用信号量一次运行一个代码段,因此所有其他线程都被阻塞并等待这个线程完成。
主 GUI 线程继续运行而不受干扰。我自己的所有线程都应该在执行后死亡(我用 mythread.setDaemon(True)
对它们进行了 deamonized)。我的python版本是2.7.3
我也在考虑输出缓冲区的可能性,它只会使它随机出现(实际上它总是在同一个地方,但一些输出可能仍然在输出缓冲区中徘徊)但是由于每次打印都会引入一个新行,我猜每个输出都会立即刷新,所以我不会错过线程卡住点的任何输出。我的开发环境是eclipse和pydev。
FileDownloader.downloadFileNewThread 从该线程内部启动另一个线程。这也会是个问题吗?线程启动其他线程?如果我不妖魔化与如果我妖魔化似乎也没有什么区别。
在我看来,代码确实随机卡住。但为什么会这样???
最佳答案
好的伙计们,经过 3 天的用头撞墙,我想我已经解决了。至少没有东西挂了。
Pygtk 好像是这个原因 http://faq.pygtk.org/index.py?file=faq20.006.htp&req=show
Pygtk 能够永远阻塞长时间运行的线程。它获得了 GIL 锁并且不松手。该线程只是卡在内存中,但不会再执行。
我所要做的就是打电话
gobject.threads_init()
在其他与 gtk 相关的事情之前。也就是说,我的代码是这样开始的
import gtk
import gobject
import MainGUI
if __name__ == "__main__":
gobject.threads_init()
from MainGUI import MainGUI
MainGUI.instance = MainGUI()
gtk.main()
幸运的是,我严格地将我的逻辑与 GUI 分开,并且从不在我自己的线程中实例化任何 gtk 元素。所以这是我真正需要的唯一一行。如果有人仍然需要能够在自己的线程中处理 GUI 对象,他必须使用
gobject.idle_add(callback_function, args)
我学到的另一个教训是,队列的内存容量可能非常有限,如果它们被塞得太多,它们也会导致阻塞行为。
Theads 启动另一个线程应该没有任何问题,因为据我所知,这些线程都是“在同一级别”启动的,python 不知道或维护它们之间的任何层次结构。 pygtk 搞砸的只是 GIL(全局解释器锁)的伪随机斗争。
关于Python 线程似乎无缘无故停止/卡住/挂起?可能的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25731113/
我对cassandra并使用1.2.10非常陌生。我有一个时间戳数据类型的主键列。现在,我正在尝试检索日期范围的数据。由于我们知道不能在cassandra中使用,因此我使用的是大于()来获取日期范围。
我正在尝试进行有条件的转场。但我得到: Terminating app due to uncaught exception 'NSInvalidArgumentException', reas
我有一个游戏项目,在调试和发布模式下在设备上运行得非常好。我有两个版本。旧版本和新版本具有更多(后来我添加了)功能,并且两者的 bundle ID、版本相同。当我构建旧版本时,之前没有安装“myGam
这个问题已经有答案了: 奥 git _a (2 个回答) 已关闭 5 年前。 我正在获取 ClassCastException 。这两个类来自不同的 jar,但是JettyContinuationPr
以下代码行抛出异常: HttpResponse response = client.execute(request); // actual HTTP request 我能够捕获它并打印: Log
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
public class TwoThreads { private static Object resource = new Object(); private static void
当我输入 6 (int) 作为值时,运行此命令会出现段错误 (gcc filename.c -lm)。请帮助我解决这个问题。预期的功能尚未实现,但我需要知道为什么我已经陷入段错误。 谢谢! #incl
所以,过去一周半我一直在研究这个 .OBJ/.MTL 网格解析器。在这段时间里,我一直在追踪/修复很多错误、清理代码、记录代码等等。 问题是,每修复一个错误,仍然会出现这个问题,而且一张图片胜过一千个
我正在运行一个代码,它基本上围绕 3 个维度旋转一个大数据数组(5000 万行)。但是,我遇到了一个奇怪的问题,我已将其缩小到如何评估旋转矩阵。基本上,对于除绕 x 轴以外的任何旋转,python 代
就在你说这是重复之前,我已经看到了其他问题,但我仍然想发布这个。 所以我正在阅读 Thinking in Java -Bruce Eckel 这篇文章是关于小写命名约定的: In Java 1.0 a
我想在我的应用程序中使用 REST API。它为我从这个应用程序发出的所有请求抛出 SocketTimeoutException。 Logcat 输出:(您也可以在此处看到带有漂亮格式的输出:http
我知道 raise ... from None 并已阅读 How can I more easily suppress previous exceptions when I raise my own
在未能找到各种Unix工具(例如xargs和whatnot)的最新独立二进制文件(this version很好,但需要外部DLL)后,我承担了自己进行编译的挑战。 ...这是痛苦的。 最终,尽管如此,
我有一个用PHP编写的流套接字服务器。 为了查看一次可以处理多少个连接,我用C语言编写了一个模拟器来创建1000个不同的客户端以连接到服务器。 stream_socket_accept几次返回fals
我的Android Studio昨天运行良好,但是今天当我启动Android Studio并想在移动设备上运行应用程序时,发生了以下错误, 我在互联网和stackoverflow上进行了搜索,但没有解
默认情况下,grails似乎为Java域对象的toString()返回:。那当然不是我想要的,所以我尝试@Override toString()返回我想要的。当我尝试grails generate-a
尝试通过LDAP通过LDAP对用户进行身份验证时,出现以下错误。 Reason: Cannot pass null or empty values to constructor. 谁能告诉我做错了什么
我正在尝试使用应用程序附带的 Houdini Python 模块,该模块是 Houdini 安装文件夹的一部分,位于标准 Python 路径之外。按照安装说明操作后,运行 Houdini Termin
简单地说,我正在为基本数据库编写单链表的原始实现。当用户请求打印索引下列出的元素高于数据库中当前记录数量时,我不断出现段错误,但仅当差值为 1 时。对于更高的数字,它只会触发我在那里编写的错误系统。
我是一名优秀的程序员,十分优秀!