首页 \ 问答 \ 停止python线程等待popen?(stopping a python thread waiting for popen?)

停止python线程等待popen?(stopping a python thread waiting for popen?)

我有一个线程调用Popen从命令行实用程序返回一个字符串。 在某些非常非常滞后的网络数据到达之前,此命令行功能不会返回。 有时它可能需要几分钟,其他时间不到一秒钟。

如果用户想要,他们可以取消等待这些数据。 在这种情况下,停止线程的正确方法是什么?

class CommThread( threading.Thread ):

    def __init__(self):
        self.stdout = None
        self.stderr = None
        self.command = None
        threading.Thread.__init__(self)

    def run(self):
        if self.command is not None:
            p = Popen( self.command.split(), shell=False, stdout=PIPE, stderr=PIPE)
            self.stdout, self.stderr = p.communicate()

I have a thread which calls Popen to get a string back from a command line utility. This command line function does not return until some very, very laggy network data arrives. Sometimes it could take minutes, other times under a second.

If the user wants, they can can cancel waiting for this data. In this case, what is the right way to stop the thread?

class CommThread( threading.Thread ):

    def __init__(self):
        self.stdout = None
        self.stderr = None
        self.command = None
        threading.Thread.__init__(self)

    def run(self):
        if self.command is not None:
            p = Popen( self.command.split(), shell=False, stdout=PIPE, stderr=PIPE)
            self.stdout, self.stderr = p.communicate()

原文:https://stackoverflow.com/questions/8440565
更新时间:2019-11-21 10:10

最满意答案

使用Popen.terminate()这里是文档http://docs.python.org/library/subprocess.html

你的代码应该是这样的:

def run(self):
    if self.command is not None:
        self.process = Popen( self.command.split(), shell=False, stdout=PIPE, stderr=PIPE)

def stop(self):
    if self.process is not None:
        self.process.terminate()

你可以在其他代码块中调用CommThread.stop()


Use Popen.terminate() here's the document http://docs.python.org/library/subprocess.html

you code should be like this:

def run(self):
    if self.command is not None:
        self.process = Popen( self.command.split(), shell=False, stdout=PIPE, stderr=PIPE)

def stop(self):
    if self.process is not None:
        self.process.terminate()

you can call CommThread.stop() in other code blocks

2011-12-09

相关问答

更多

Java Android FTP上传问题和“异步”(Java Android FTP Upload Issue & “Async”)

可耻地我最初没有看到关于异步任务的文档 ,这已被证明是非常宝贵的。 尽管有一些改进,但我还是有效。 我刚修改了我的课程: private class FtpUpload extends AsyncTask<Void, Void, Void> { protected Void doInBackground(Void... params) { //code here } 并使用以下方法调用上面的Async方法: new FtpUpload().execute(); 当然,如

如何在Android上使用JavaMail检测消息线程?(How to detect message threads using JavaMail on Android?)

对于Android,您可以在此处使用我的端口。 我已经成功地将它用于项目,我只是用Harmony实现替换了java依赖项并将其转换为Android库项目以确保没有使用任何不受支持的项目。 你可以用它做一个罐子(我应该:P)。 For Android, you can use my port here. I have used it for a project successfully, I just replaced the java dependencies with Harmony impl

string.split中的Java outOfMemory异常(Java outOfMemory exception in string.split)

您应该首先尝试将文件缩小到足够小以使其正常工作。 这将允许您评估您有多大的问题。 其次,你的问题肯定与String#split无关,因为你一次只在一行上使用它。 Vertex和Edge实例的Vertex是什么。 您将不得不重新设计一个更小的占用空间,或彻底检查您的算法,以便只能在内存中使用图形的一部分,其余部分在磁盘上。 PS只是一般的Java注释:不要写 String s1 = new String(tokens[0]); String s2 = new String(tokens[1]);

即使正确放置模块后也会导致ImportError(ImportError even after placing modules correctly)

您尝试导入的模块必须位于要导入它们的.py文件旁边,或者需要将这些模块所在的目录添加到PYTHONPATH 。 请参阅: https : //docs.python.org/2/tutorial/modules.html#the-module-search-path The modules you are trying to import either have to be next to the .py file you are importing them in, or the direct

如何在Eclipse中运行的Tomcat上启用HTTPS?(How do I turn on HTTPS on Tomcat running in Eclipse? (or: How do I edit the server.xml file Eclipse is using when it runs Tomcat?))

我能够更改“服务器位置”,因此Eclipse不使用自己的配置文件并使用我的Tomcat安装目录中的配置文件。 我通过运行服务器,取消部署所有应用程序,在“服务器”视图中双击我的服务器,以及将“服务器位置”从“使用工作空间元数据”更改为“使用Tomcat安装”来完成此操作。 现在,当我启动/停止Eclipse时,它会获取我的server.xml更改。 I was able to change the "Server Location" so Eclipse doesn't use its own

group-by / apply with Pandas and Multiprocessing(group-by/apply with Pandas and Multiprocessing)

您的代码中存在两个主要问题原因 使用python的内置sum函数。 这是一个函数,它接受一个可迭代的数字并返回它们的总和。 例如,如果您尝试对数据帧df的一部分求和,您将获得相同的错误追溯 总和(df.loc [1]) TypeError Traceback (most recent call last) <ipython-input-60-6dea0ab0880f> in <module>() ----> 1 su

c ++ 11中的线程id行为(thread id behavior in c++11)

std::thread::get_id()只是一个任意值,它唯一的属性是保证当前运行的每个线程都是唯一的(但是当一个线程结束时,它的id可以被重用)。 为了告诉首先启动哪个线程,您必须自己完成:例如。 维护一个计数器并以某种方式将值与线程相关联,或者将两者都包装在一个类中,或者将值传递给线程函数,或者使用线程局部存储,...你明白了。 我想不出任何为你做这件事的C ++或系统工具,也许是因为知道一堆线程的相对创建顺序通常是没有意义的。 你只需要解雇他们,让他们完成自己的工作。 std::thre

钛httpclient异常请求不好(titanium httpclient exception bad request)

我刚刚解决了问题,将“post”替换为“POST”,然后就可以了 I just solved the problem, replace the "post" to "POST" ,and then it works

相关文章

更多

最新问答

更多
  • 根据Woocommerce中的自定义字段计算自定义购物车商品价格(Custom cart item price calculation based on dimentions custom fields in Woocommerce)
  • 分开foreach项目并单独打印(Separate foreach items and print them individually)
  • 写模式管道是否同步?(Is write mode pipe synchronous?)
  • 发现可用的Windows Phone强调色和本地化名称(Discover available Windows Phone accent colors and localized names)
  • 使用多线程和WPF更新集合(Update Collection with multithreading and WPF)
  • 如何在字符串的情况下使用同步?(How should the synchronization be used in case of strings?)
  • 打印唯一的行,比较不超过N个字符(Print unique lines, compare no more than N characters)
  • Javascript / jQuery - 如何调用switch case从另一个函数执行(Javascript/jQuery - how to call a switch case to execute from another function)
  • Hbase超时错误不断发生(Hbase timeout errors keep occuring)
  • 如何在Delphi中更改TabControl中活动TAB的颜色(How to change the color of active TAB in a TabControl, in Delphi)
  • 正则表达式:在sublime文本中替换一些PHP代码(Regex: replace some pieces of php code in sublime text)
  • 在带有Scene2D的LibGDX中,如何在按下按钮时连续向右走?(In LibGDX with Scene2D, how can I continuously walk to the right when a button is pressed?)
  • 累加器如何在Haskell中工作?(How do accumulators work in Haskell?)
  • 使用开关检查市场和前缀与正确的货币符号(using switch to check market and prefix with correct currency symbol)
  • 在哪里分配一次使用类?(Where to allocate one time use class?)
  • 如何从两个DateTime / NaiveDateTime获取持续时间?(How do I get Duration from two DateTime / NaiveDateTime?)
  • 解析TimeSpan大于24小时?(Parse a TimeSpan greater than 24 hours? [duplicate])
  • 如何在球拍中本地更改阅读规则?(How to locally change reading rules in racket?)
  • 数据库应该由DI注入时的模拟存储(通过构造函数)(Mock storage when database should be injected by DI (through constructor))
  • 使用maven集成2个eclipse项目(Integrate 2 eclipse projects using maven)
  • 角度ng-repeat不检测变化(Angular ng-repeat not detecting changes)
  • Xaml组件在Silverlight + XNA应用程序的多个页面中可见(Xaml component visible in multiple pages in Silverlight+XNA applications)
  • 如何将`var`变量等同于另一个查询(How to equate `var` variable to another query)
  • 如何设计hyperledger链代码以适合您的业务?(how to design your chaincode of hyperledger to fit for your business?)
  • PHP readfile错误(PHP readfile error)
  • 在Date之后排序列表然后是时间(Sorting list after Date then time)
  • Android内部版本号(Android build number)
  • 在没有预设退出条件的情况下停止无限循环(stopping an infinite loop with no preset exit condition)
  • Phonegap应用程序全屏通过html页面中的按钮(Phonegap Application fullscreen through a button in html page)
  • PAA是否适合在门户网站中自动执行wcm库部署和设置?(Is PAA a good candidate for automating wcm library deployment and setup in portal?)