相关疑难解决方法(0)

在时间段后停止代码

foo(n)如果它运行超过10秒钟我想打电话但是停止它.这样做的好方法是什么?

我可以看到我理论上可以修改foo自己以定期检查它运行了多长时间,但我宁愿不这样做.

python

30
推荐指数
2
解决办法
6万
查看次数

具有超时和大输出的python子进程(> 64K)

我想执行一个进程,以秒为单位将执行时间限制为一些超时并获取进程产生的输出.我想在windows,linux和freebsd上做这个.

我试过以三种不同的方式实现它:

  1. cmd - 没有超时和subprocess.PIPE用于输出捕获.

    行为:按预期运行但不支持超时,我需要超时...

  2. cmd_to - 使用timeout和subprocess.PIPE进行输出捕获.

    BEHAVIOR:当输出> = 2 ^ 16字节时阻止子进程执行.

  3. cmd_totf - 使用timeout和tempfile.NamedTemporaryfile进行输出捕获.

    行为:按预期运行,但在磁盘上使用临时文件.

这些可在下面获得进一步检查.

从下面的输出中可以看出,当使用子处理时,超时代码会阻止子进程的执行.PIPE和子进程的输出是> = 2 ^ 16字节.

子进程文档说明在调用process.wait()和使用subprocessing.PIPE时这是预期的,但是在使用process.poll()时没有给出警告,那么这里出了什么问题?

我在cmd_totf中有一个使用tempfile模块的解决方案,但权衡是它将输出写入磁盘,这是我真正想要避免的.

所以我的问题是:

  • 我在cmd_to做错了什么?
  • 有没有办法做我想要的,不使用临时文件/保持输出在内存中.

用于生成一堆输出的脚本('exp_gen.py'):

#!/usr/bin/env python
import sys
output  = "b"*int(sys.argv[1])
print output
Run Code Online (Sandbox Code Playgroud)

子处理周围包装器的三种不同实现(cmd,cmd_to,cmd_totf).Popen:

#!/usr/bin/env python
import subprocess, time, tempfile
bufsize = -1

def cmd(cmdline, timeout=60):
  """
  Execute cmdline.
  Uses subprocessing and subprocess.PIPE.
  """

  p = subprocess.Popen(
    cmdline,
    bufsize = bufsize,
    shell   = False,
    stdin   = subprocess.PIPE,
    stdout  = subprocess.PIPE,
    stderr  = subprocess.PIPE
  ) …
Run Code Online (Sandbox Code Playgroud)

python subprocess timeout

10
推荐指数
1
解决办法
8803
查看次数

在Windows中一段时间​​后杀死一个函数

我已经阅读了很多关于使用线程,子进程等的帖子.对于我正在尝试做的事情,很多事情似乎过于复杂......

我想要做的就是在X时间过后停止执行一个函数.

def big_loop(bob):
    x = bob
    start = time.time()
    while True:
        print time.time()-start
Run Code Online (Sandbox Code Playgroud)

此函数是一个无限循环,永远不会抛出任何错误或异常,句点.我不确定"命令,shell,子进程,线程等......"和这个函数之间的区别,这就是我在操作子进程时遇到问题的原因.

我在这里找到了这个代码,然后尝试了它,但是你可以看到它在10秒后继续打印:

import time
import threading
import subprocess as sub
import time

class RunCmd(threading.Thread):
    def __init__(self, cmd, timeout):
        threading.Thread.__init__(self)
        self.cmd = cmd
        self.timeout = timeout

    def run(self):
        self.p = sub.Popen(self.cmd)
        self.p.wait()

    def Run(self):
        self.start()
        self.join(self.timeout)

        if self.is_alive():
            self.p.terminate()
            self.join()

def big_loop(bob):
    x = bob
    start = time.time()
    while True:
        print time.time()-start

RunCmd(big_loop('jimijojo'), 10).Run()  #supposed to quit after 10 seconds, but doesn't
x = raw_input('DONEEEEEEEEEEEE')
Run Code Online (Sandbox Code Playgroud)

这个功能被杀死的简单方法是什么.正如你在上面的尝试中所看到的那样,它在20秒后不会终止并继续......

***哦,我也读过有关使用信号的内容,但是我在Windows上,所以我不能使用闹钟功能..(python …

python

7
推荐指数
1
解决办法
7520
查看次数

如何在urlopen上永远阻止阻塞

我遇到的问题是urllib2.urlopen/ requests.post是很偶然阻塞永远对socket.recv不退还.

我试图找出为什么会发生这种情况并解决这个问题,但同时我想知道是否有办法防止它永远阻塞?

我已经知道了timeout可选参数urllib2.urlopen,socket.setdefaulttimeout但不幸的是,对于我的用例,超时不是解决方案因为我使用POST上传文件我使用的任何超时值都可能会中断正常的文件上传.

我也看到了一些使用信号的解决方案,但这会产生与使用超时相同的问题(也是问题,因为我不是从主线程中执行此操作).

是否有可能在没有数据通过套接字发送/接收一段时间后才能超时?或者也许有一些方法我可以使用select/poll来防止我遇到的死锁/阻塞?

如果有使用select/poll的解决方案,我将如何将其合并到urllib2.urlopen/ requests.post


我还有一个想法,如果我可以通过写入类型的接口发送文件数据,所以我控制迭代文件并一次发送块我可能有足够的控制来避免停顿.我不知道如何实现它,所以我问了一个问题:使用file.write接口上传文件

更新 似乎我总是误解了timeoutpython 中的含义,它似乎实际上是空闲超时或读/写超时(可能是我第一次不同意Guido).我一直以为这是响应应该返回的最长时间 - 谢谢@tomasz指出这个!

但是,增加超时参数(这两个测试后urllib2requests)我已经遇到了一些非常奇怪和微妙的情况下,可能MAC具体,超时工作不正常,我正在越来越倾向于认为是一个错误.我将继续调查并确切地找出问题所在.再次感谢tomasz对此的帮助!

python sockets urllib2 python-2.7

3
推荐指数
1
解决办法
3185
查看次数

标签 统计

python ×4

python-2.7 ×1

sockets ×1

subprocess ×1

timeout ×1

urllib2 ×1