|
|
1
6
首先,应不惜一切代价避免使用信号: 1) 这可能导致僵局。SIGALRM可能在阻塞系统调用之前到达进程(想象一下系统中的超高负载!)系统调用不会被中断。僵局。
相信我-我以前遇到过两个问题,它们一点都不好玩。 在某些情况下,可以明确地避免阻塞—我强烈建议使用select()和friends(在Python中选中select模块)来处理阻塞的写入和读取。不过,这并不能解决阻塞open()调用的问题。 为此,我已经测试了这个解决方案,它对命名管道很有效。它以非阻塞方式打开,然后将其关闭,如果没有可用的内容,则使用select()调用最终超时。
通过一些额外的努力,select()调用可以用作整个程序的主循环,聚合所有事件-您可以使用libev或libevent,或者使用一些Python包装器来包装它们。
恐怕一般来说,你不能用一种强有力的方法来解决这个问题——这真的取决于你阻止了什么。 |
|
|
2
4
IIUC,每个顶层块都有一个停止方法。因此,您实际上可以在线程中运行top_块,并在超时到达时发出停止。如果top_块的wait()也有超时,那会更好,但唉,它没有。 在主线程中,您需要等待两种情况:a)top_块完成,b)超时过期。忙碌的等待是有害的:-),所以应该使用线程的带超时连接来等待线程。如果连接后线程仍处于活动状态,则需要停止顶部运行。 |
|
|
3
2
您可以设置一个信号警报,它会在超时时中断您的通话: http://docs.python.org/library/signal.html
如果要确保不会破坏应用程序,也可以设置信号处理程序:
编辑:
问题是:
|
|
|
4
2
你问题中最简单的部分是信号处理。从Python运行时的角度来看,在解释器进行系统调用时接收到的信号作为OSError异常呈现给Python代码,其中
所以这大概和你想的差不多:
注意我已经移动了
我试图说明的关键点是,任何(不被忽略的)信号都会中断Python代码执行的主线。将使用参数调用处理程序,这些参数指示触发执行的信号号(允许一个Python函数用于处理许多不同的信号)和一个frame对象(可用于某种调试或检测)。 厄尔诺 通过循环返回以重试或分支到主线中的某个备选方案(例如继续执行某个其他文件,或不执行任何文件/输入等)。 正如其他人在回答您的问题时所指出的,基于SIGALARM的方法可能会充满可移植性和可靠性问题。更糟糕的是,其中一些问题可能是您在测试环境中永远不会遇到的竞争条件,并且可能只在极难再现的条件下发生。丑陋的细节往往是在重新进入的情况下——如果在执行信号处理程序期间发送信号,会发生什么情况? 我在一些脚本中使用过SIGALARM,在Linux下,这对我来说不是问题。我正在编写的代码适合这项任务。它也许能满足你的需要。
浏览一下你链接到的文档,我发现它们似乎没有提供任何可以用来直接限制阻塞行为的“超时”参数或设置。在“控制流图”下面的表格中,我看到他们特别指出
听起来你可以创建流图,
也许是简单的事情:
.. 尽管我怀疑
|
|
|
5
1
如果“If time.time()<endtime:”,那么您将跳出循环,seq2发送的内容将永远不会被命中,也许您在该测试中是指“time.time()>endtime”? |
|
|
6
0
您可以尝试使用延迟执行。。。Twisted框架经常使用它们 |
|
|
7
0
另一个问题的答案如下: python: how to send packets in multi thread and then the thread kill itself 或者google for killable python threads获取更多类似的细节: http://code.activestate.com/recipes/496960-thread2-killable-threads/ |
|
|
8
-1
如果要设置阻塞函数的超时,则将threading.Thread作为方法连接(timeout),它将阻塞到超时。 基本上,像这样的事情应该做你想做的:
|
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 9 月前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 9 月前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 9 月前 |
|
|
András Takács · Python多线程问题 1 年前 |
|
|
András Takács · Python多线程错误 1 年前 |