为什么带有子进程的 Python 线程无法按预期工作?

2024-06-28

我有以下微妙的问题: Python 代码启动两个线程,每个线程创建一个对可执行文件(实际上是用 C 编写的)的子进程调用。第一个可执行文件传递参数 10000,这意味着在退出之前延迟 10 秒。第二个可执行文件类似,但延迟了 20 秒。

我观察到,worker1 和worker 2 同时进行打印输出,即在 20 秒后(两个延迟中较长的一个)。为什么是wait()对于worker1来说,由于另一个人的较长延迟而“阻塞”了?无论我作为参数传递什么,两个打印输出都紧接在两个时间中较长的时间之后。

注意:这是一个用于演示目的的简化示例,而不是我正在处理的代码。无论如何,它与打印输出无关,在我的原始代码中,我没有打印而是做了一些更复杂的事情。

import subprocess
import threading
import time


def worker1():
    proc = subprocess.Popen(["../testapp1.exe", "10000"], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    outs, errs = proc.communicate()
    ret = proc.wait()
    print("result worker1:%s ret:%d" % (outs, ret))
    print("done")


def worker2():
    proc = subprocess.Popen(["../testapp2.exe", "20000"], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    outs, errs = proc.communicate()
    ret = proc.wait()
    print("result worker2:%s ret:%d" % (outs, ret))
    print("done")


job_thread1 = threading.Thread(target = worker1)
job_thread1.start()

job_thread2 = threading.Thread(target = worker2)
job_thread2.start()

job_thread1.join()
print ("after join1")
job_thread2.join()
print ("after join2")
# time.sleep(20000) original

可执行文件:

#include <string.h>
#include <windows.h>


int main(int argc, char *argv[])
{
  int count;
  //printf ("This program was called with \"%s\".\n",argv[0]);

  int sleep = 0;

  if (argc > 1)
  {
      for (count = 1; count < argc; count++)
      {
          if (count == 1)
          {
              sleep = atoi(argv[1]);
          }
          printf("\nargv[%d] = %s\n", count, argv[count]);
      }
  }
  else
  {
      printf("The command had no other arguments.\n");
  }

  int fin = sleep;
  for (int i=0; i<fin; i++)
  {
      for (int i2=0; i2<100; i2++);
  }
  //Sleep(sleep);

  return 0;
}

编辑:当我删除“沟通”时,它会因某种原因起作用。但在这种情况下我无法获得该过程的输出......

def worker1():
    proc = subprocess.Popen(["../testapp1.exe", "10000"], shell=False, 
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    # outs, errs = proc.communicate()
    ret = proc.wait()
    print("result worker1:%s ret:%d" % (outs, ret))
    print("done")

编辑2:我发现仅使用 wait() ,它在标记的标签处阻塞,在该标签处读取管道的输出......

def worker1():
    try:
        proc = subprocess.Popen(["../testapp.exe", "100000000"], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        ret = proc.wait()
        xread = proc.stdout.read() ### !!!! BLOCKS
        print("xread:",xread)  
        sys.stdout.write("done-1")
        sys.stdout.flush()
    except ComError as e:
        print("got exception")
        raise e

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么带有子进程的 Python 线程无法按预期工作? 的相关文章

  • Django - form_valid() 与 save()

    在 django 表单中 为了保存我通常使用的其他数据form valid 但因为我也可以使用save 表单类的方法 今天我重写了save 代替form valid 我的多对多领域出现了问题 使用时 manytomanyfield 的值不会
  • 我可以使用类属性作为实例方法的默认值吗?

    我想使用类属性作为我的类的参数之一的默认值 init 方法 这个构造提出了一个NameError不过 例外 我不明白为什么 class MyClass DefaultName DefaultName def init self name M
  • Python Twisted WebSocket 客户端

    过去曾使用过 Twisted 我想知道是否有办法让 WebSocket 客户端支持发挥作用 浏览文档我只能找到服务器实现 塔文多高速公路 http www tavendo de autobahn 是一个非常有特色的 websockets 实
  • async for 的语义等价物

    从相对于的文档async for根据 Python 3 5 中的语法 我发现引入它是为了迭代可等待的迭代器 不过 在描述之后的语义等价物中 我没有得到一些东西 iter ITER iter type iter aiter iter runn
  • pycharm自动将制表符转换为空格

    我正在使用 pycharm IDE 进行 python 开发 它对于 django 代码来说工作得很好 因此怀疑将制表符转换为空格是默认行为 但是在 python IDE 中到处都会出现错误 因为它无法自动将制表符转换为空格 有没有办法实现
  • 替换 pytest 中的测试用例继承?

    背景 在 Python 中unittest https docs python org 3 library unittest html在框架中 在一组基本测试上使用继承来将整套测试应用于新问题 并且偶尔添加其他测试是一种相当常见的习惯用法
  • 没有要聚合的数字类型 - groupby() 行为发生变化吗?

    我对一些团体代码有问题 我很确定这些代码曾经运行过 在较旧的 pandas 版本上 在 0 9 上 我得到没有要聚合的数字类型错误 有任何想法吗 In 31 data Out 31
  • 一个类的多个实例

    我正在尝试用 python 编写各种动物的生活模拟 不可能命名我将要使用的类的每个实例 因为我无法知道会有多少个实例 所以 我的问题是 如何自动为对象命名 我正在考虑创建一个 Herd 类 它可以是该类型的所有动物同时存活 嗯 通常 您只需
  • Keras 的 ImageDataGenerator 是否随机对每个图像应用转换?

    我正在使用 Keras ImageDataGenerator 类训练 CNN 我的代码看起来像这样 from keras callbacks import LearningRateScheduler from keras callbacks
  • Python中字典转小写

    我希望这样做 但为了一本字典 My string lower 是否有内置函数或者我应该使用循环 您将需要使用循环或列表 生成器理解 如果你想将所有的键和值都小写 你可以这样做 dict k lower v lower for k v in
  • pandas read_csv() 方法支持 zip 存档读取,但 to_csv() 方法不支持 zip 存档保存

    Pandas 0 18 支持 read csv zip 文件作为参数 并将压缩的 csv 表正确读取到数据框中 但是当我尝试使用 to csv 方法将数据帧保存为压缩 csv 时 我收到错误 根据官方文档 to csv 方法不支持zip格式
  • 如何为 apache beam 数据流的输出 csv 添加标头?

    我注意到在java SDK中 有一个函数可以让你编写csv文件的标题 https cloud google com dataflow java sdk JavaDoc com google cloud dataflow sdk io Tex
  • 手动将行添加到 StreamingHttpResponse (Django)

    我正在使用 Django 的 StreamingHttpResponse 动态传输大型 CSV 文件 根据the docs https docs djangoproject com en 1 11 ref request response
  • 如何在条形图上添加值标签

    我正在创建一个条形图 但我不知道如何在条形图上添加值标签 在条形图的中心或正上方 我相信解决方案是使用 文本 或 注释 但我 a 不知道该使用哪一个 一般来说 还没有弄清楚何时使用哪一个 b 无法看到任何一个来呈现值标签 这是我的代码 im
  • python中带括号和不带括号调用函数有什么区别? [复制]

    这个问题在这里已经有答案了 我有个问题 假设我们有函数 hello 带括号和不带括号调用有什么区别 当我调用 hello 时 它引用的是一个值等于此函数的对象 或者也许我错了 当我不带括号调用它时会发生什么 我想知道为什么 def hell
  • matplotlib中有制作散点图矩阵的函数吗?

    散点图矩阵示例 matplotlib pyplot中有这样的函数吗 对于那些不想定义自己的函数的人来说 Python 中有一个很棒的数据分析库 称为Pandas http pandas pydata org 在那里可以找到分散矩阵 http
  • 使用正则表达式在 Pandas Series 的各个单元格内分隔逗号分隔的值

    我有一个来自数据库的 csv 文件 我已将其转换为我正在尝试清理的 Pandas DataFrame 问题之一是多个值已输入到需要拆分的单个单元格中 复杂的因素是有一些字符串注释 也带有逗号 需要保持完整 下面的示例以系列形式说明了该问题
  • Scikit-learn 中的 GridSearchCV 输出问题

    我想执行超参数搜索以在 sklearn 中选择预处理步骤和模型 如下所示 pipeline Pipeline combiner PolynomialFeatures dimred PCA classifier RandomForestCla
  • 无法在 BeautifulSoup 中获得正确的链接

    我正在尝试解析一些 HTML 并且想提取与特定模式匹配的链接 我正在使用find使用正则表达式的方法 但它没有给我正确的链接 这是我的片段 有人可以告诉我我做错了什么吗 from BeautifulSoup import Beautiful
  • 为什么我不能将 addstr() 添加到 pythoncurses 窗口中的最后一行/列?

    使用Python 我尝试使用addstr 将光标位置写入curses 窗口的右下角 但出现错误 ScreenH 2工作正常 但打印在窗口底部的第二行 ScreenH 1根本不起作用 我究竟做错了什么 import curses Screen

随机推荐

  • Android 日期选择器月份作为数字

    在 Android DatePicker 中 在某些操作系统中 月份显示为 Jan Feb Mar Dec 在其他操作系统中 月份显示为 1 2 3 12 有没有办法让它始终保持一致 以便它始终显示 1 2 3 12 作为月份 显示 1 2
  • 无法从innerHTML获取动态数据 - Angular

    我从我的视图或 HTML 中获取动态数据并将其放置在我的页面上 以便我可以查看所述数据的打印结果 我必须使用此方法 因为我正在使用此动态数据创建自己的打印页面 我使用的方法获取第一个初始值 而不是最新更新的 DOM 如果删除 innerHT
  • UIWebView webCore 在 iOS7.1 中崩溃(示例:www.latimes.com)

    当我打开 洛杉矶时报 www latimes com 时 我的 iOS 应用程序崩溃了 崩溃发生在 WebCore 的某个地方 但我不知道在哪里 使用 Zombie 或 leaks 进行分析不会针对此 EXE BAD ADDRESS 错误返
  • Symfony 3 - 自动序列化 DateTime 对象

    在我的项目中我有一些实体createdAt柱子 class Acme var DateTime ORM Column name created at type datetime protected createdAt 我已启用FOSRest
  • MySQL 中的 char / varchar / text / longtext 列是否在文件系统中占据完整大小,即使对于部分填充的单元格也是如此?

    MySQL 中的 varchar text longtext 列是否占据文件系统中的完整长度大小 即使对于不完整的单元格也是如此 参考这篇博客文章 http boolean co nz blog max length for mysql t
  • 跟踪代码的来源 (PHP)

    我正在浏览客户的服务器 运行疯狂的专有论坛 软件 vBulletin 甚至更糟糕的 SEO 模组 vbseo 我想不通 找出页面的 php 代码来自哪里 如何追踪这个 返回 PHP 页面的 URL http www example com
  • 64位Java无法通过ODBC访问32位MS Access数据库

    我有一台新的 64 位笔记本电脑 并安装了 STS 64 位和 Java 64 位 我正在尝试创建到 32 位 Microsoft 数据库的 ODBC 连接 但是默认的管理工具不提供访问驱动程序 经过谷歌搜索后 我发现 C Windows
  • 正则表达式“只分组,不捕获”似乎不起作用

    x abcdefg x x match ab cd ef x 不应该是 abef 吗 不是 它实际上是 abcdef 为什么我的 没有任何效果 当然我的理解很可能是错误的 still matches 它只是不会出于以下目的创建新组 1 1
  • JQGrid 列自动宽度

    我只是想知道如何将 jqGrid 列宽度设置为自动 colModel name MyDescription index description align left width 150 sortable false 对于上面的语句 我如何指
  • 如何对 Sharepoint 工作流程进行故障排除?

    我在这里有点迷失 找不到太多文档 NET 工作流程还是使用 SharePoint 设计器创建的工作流程 我只获得了后者的经验 而且它们并不容易调试 您实际上只需要一次执行一步并测试每一步 当您转到 列表设置 时 您也可以在 SharePoi
  • mysql字符串转换返回0

    why select aaa 0返回 1 真 如果我有一张像这样的桌子 userid pass user1 pas1 如果我查询 select from table where userid 0 and pass 0 它给了我所有的行 My
  • Scala变量作用域问题

    我有一个 scala 语法问题 假设我有一个简单的依赖模式构造 如下所示 trait Master val foobar object SubObject extends SubObject foobar foobar trait SubO
  • MySQL 设置自动增量“Ad Hoc”

    有没有办法以 临时 方式将 mysql 的 auto increment 设置为某个整数 例如 表中已删除 N 个最新行 因此主键 auto increment 与实际行数相差 N 有没有办法将 auto increment 设置为正确的数
  • 对于 ActiveReord 中的 has_many 关联,counter_cache 不会递减

    我的 Rails 3 应用程序有 2 个模型 第三个模型是它们之间的联接表及其 has many 关系 基本上 User 和 Show 通过 SavedShow 连接起来 允许用户保存节目列表 class Show lt ActiveRec
  • Java Builder 模式和“深”对象层次结构

    在 深层 对象层次结构中使用生成器模式的最佳实践是什么 为了详细说明 我探索了将 Joshua Bloch 提出的 Builder 模式应用到我的 XML 绑定代码的想法 我使用的是 SimpleXML 但这个问题适用于任何情况 我的对象层
  • 对于多个人脸,CIFaceFeature TrackingID 始终相同

    我想在我的项目中检测多张面孔 因此我打算使用 CIFaceFure 的trackingID属性来跟踪面部 但我发现每次每张脸的情况都是一样的 所以我的问题是 当视频帧中存在多张脸时 如何唯一地识别一张脸 我不想识别脸部以供以后仅检测当前视频
  • 如何在 iOS 8 中强制视图控制器方向?

    在 iOS 8 之前 我们结合使用以下代码支持的接口方向 and 应该自动旋转委托方法强制应用程序定向到任何特定方向 我使用下面的代码片段以编程方式将应用程序旋转到所需的方向 首先 我正在更改状态栏方向 然后 只需呈现并立即关闭模态视图即可
  • 为什么 Python 中没有显式的空性检查(例如 `is Empty`)

    Python 之禅 https www python org dev peps pep 0020 说 显式优于隐式 然而 检查是否为空的 Pythonic 方法是使用隐式布尔值 if not some sequence some seque
  • 我可以将 GitHub 中的源文件嵌入到 Gists 之外的网页上吗?

    Context 您可以创建一个Gist https gist github com 在 GitHub 上并将其嵌入到您的网页中 嵌入要点 https help github com articles about gists embeddin
  • 为什么带有子进程的 Python 线程无法按预期工作?

    我有以下微妙的问题 Python 代码启动两个线程 每个线程创建一个对可执行文件 实际上是用 C 编写的 的子进程调用 第一个可执行文件传递参数 10000 这意味着在退出之前延迟 10 秒 第二个可执行文件类似 但延迟了 20 秒 我观察