问题标签 [multiprocess]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3064 浏览

c++ - QProcess:进程仍在运行时被销毁

我正在使用 Qt 为 2D 绘图库 xmgrace 开发自定义控制界面。我的项目中有 3 个组件:

  1. 用 Qt 制作的 GUI
  2. 一个 QThread,它在后台线程中从 C 运行一些共享对象代码。
  3. 使用管道连接到上述两者的 xmgrace 窗口。(使用 Grace_np 库)

(1) --> (2)通过更改共享对象代码中声明的一些全局变量的状态来完成通信。

来自(1) --> (3)&(2) --> (3)的通信使用由 grace_np 库提供的内置函数。

现在,来自的通信(2) --> (1)是导致问题的原因。我尝试了两种我能想到的方法:a)在 Qt 代码中声明一个共享对象,它发出一个 Qt 信号并在 C 代码中调用。b) 从线程返回并使用返回值执行一些操作,然后重新启动线程。

这两种方法都给出了不可靠的结果。我的 GUI 卡住/导致分段错误,我收到以下消息:

QProcess: Destroyed while process is still running

我没有在我的代码中的任何地方使用 QProcess 类。所以这成了一个谜。请提供一些信息,说明这可能是什么原因。

PS:管道(3)是一种方式,仅需要这种方式。

编辑1:

仅供参考,我使用的是 Qt 4.2,所以我不能使用 QObject 方法,然后使用 movetothread() 我很抱歉没有放代码,因为我不能因为公司政策,也因为我没有知道该放什么(它太大了)。共享的 c 代码是 400k+ 行

我相信我找到了问题的罪魁祸首。似乎使用类 QMessageBox 导致了这个问题。我最初使用的是 QMessageBox 的静态函数。现在我尝试在堆栈和堆上声明它,但问题仍然存在。但是我发现从我的代码中删除对 QMessageBox 的所有调用可以解决问题。但是现在的问题是,我如何显示消息?我只是在这里推测,但是 QMessageBox 的模式性质是否可能阻塞了我的程序和 xmgrace 之间存在的管道并随后导致它退出?然后创建一个自定义 QMessageBox(非模态)可能会解决这个问题。

编辑2:

我没有从工作线程调用 QMessageBox 。加上我使用工作线程的方式,除非我关闭程序,否则它永远不会返回。给出一个想法,我的 QThread::run 函数的形式是:

其中 c_init 和 c_run 是从共享 c 代码链接的函数。所以不可能直接从这些内部调用 QMessageBox 。现在我打算取消 QMessageBox 并改用 QMainWindow 状态栏。但是它并没有提供全部功能。我想这可能是 Qt 4.2 中的一个错误

编辑3:

我之前提到过,沟通(2) --> (1)是导致问题的原因。现在我已经完全取消了这种通信,并且更准确地发现问题是由启动工作线程后随时调用 QMessageBox 引起的。前面提到的通信导致 Qt 间接发出信号并调用 QMessageBox,我认为这是罪魁祸首。

编辑4:

好吧,我忘了提到从一开始就围绕这个问题的最大谜团。我基本上通过 ssh 在工作站(位置 B)上工作(位置 A),我在该工作站上编写代码并运行该程序。B 连接在 2 个物理网络上。A 通过网络 1 连接到 B。现在,从我在 A 的终端(即通过网络 1 在 ssh 上)工作时,这个问题从未发生过。但是当我直接访问 B 或通过网络 2 通过 ssh 访问 B 时,它始终会发生。请注意,每次代码仅在 B 上执行。这两个网络都被数百人使用。

编辑 5

最后,我通过子类化 QDialog 并制作自定义 MessageBox 解决了我的问题,因为我真的不需要 QMessageBox 的扩展功能。我仍然不知道 QMessageBox 中究竟是什么导致了这个问题。我想 Qt 中的一些错误将永远是一个谜。

0 投票
1 回答
383 浏览

ruby-on-rails - ruby on rails - 具有不同进程 ID 的延迟作业更新同一列

我发现了这个问题,它与锁无关。似乎在生产中,我有一个工作:工作永久运行,这被称为我不知道如何!因此,该进程处理的所有作业都会在其他地方做某事!而且其他地方不是我的数据库,所以我只是将其杀死,一切都开始正常工作。

对不起,浪费你的时间!!


对不起,忘了告诉我正在使用 rails 2.3.8!

我对来自不同后台进程的同一行、同一列进行了异步更新。我正在使用delayed_jobs gem。

我想做的是:

我的数据库是mysql,我写的表是InnoDB。

所以问题是,在不同的delayed_jobs 中运行该查询会导致一些数据增量丢失。请注意 (column = column + #{updated_number}) 我想增加表上的当前值!

使用 rails lock 不起作用,因为每个延迟的作业都在不同的进程中运行,我想更像是表是否有一些锁可以安全地进行更新。

还有一件事,使用锁!,在我的开发代码中,我运行了 3 次 rake 作业:工作,然后我在 delay_job 表上确认 3 个不同的进程锁定了 3 个作业,并且它是完美运行的开发代码。

但是,当将该代码投入生产时,它就不起作用了。增量数据的丢失仍然存在。

0 投票
2 回答
31 浏览

linux - how to prevent the process launching if it was launched before?

I have application that has a several process, including the authentication process. I need to prevent launching of authentication, if connection was established and authentication successfull. How can I implement this behavior? Platform - linux.

0 投票
1 回答
412 浏览

powershell - Powershell中的多处理执行程序达到阈值

我在调用 SSIS 包的字符串数组中有多个命令。为了利用硬件,我想一次运行多个包,等到一个包完成后再添加另一个包。通过查看关于 SO 的其他类似问题,我认为这样的事情会起作用:

这确实可以打开 6 个记事本,但它不会等待某个阈值 - 在本例中为 2。理想情况下,它应该等到我关闭其中一个记事本(即过程完成)。

以前有人会这样做吗?

0 投票
2 回答
2006 浏览

python - Python中的多处理,具有大量进程但限制cpu数量

我有大量数据文件需要通过函数 A 处理。假设有 1000 个文件,每个文件的每个处理时间不到 15 分钟,内存为 6GB。我的电脑有 32GB 和 8 个 CPU,所以为了安全起见,我一次最多可以使用 4 个进程(24GB 内存和 4 个 CPU)。所以我的问题是我可以在python中使用多进程包来创建4个进程,并且每个进程不断地获取函数A来独立处理一个数据文件,如下图所示。很明显,每个 cpu 必须处理大约。250个文件,但1000个文件的文件大小不同,那不一定是真的。需要注意的是,一旦一个进程完成,那么无论其他进程是否完成,它都会立即分配一个新作业,即所有四个进程同时完成都没有等待时间。函数 A 的返回在这里并不重要。请提供代码!谢谢你的任何建议。

在此处输入图像描述

0 投票
1 回答
747 浏览

c - dup() 后跟来自多个线程或进程的 close()

我的程序按时间顺序执行以下操作

  1. 该程序以 root 权限启动。
  2. 在其他任务中,编辑了一个只有 root 权限才能读取的文件open()
  3. 根权限被删除。
  4. 子进程生成clone()CLONE_FILES | CLONE_FS | CLONE_IO设置了标志,这意味着虽然它们使用不同的虚拟内存区域,但它们共享相同的文件描述符表(和其他 IO 内容)。
  5. 所有子进程execve()自己的程序(FD_CLOEXEC不使用该标志)。
  6. 原程序终止。

现在我希望每个生成的程序都读取上述文件的内容,但是在他们都读取了文件之后,我希望它被关闭(出于安全原因)。

我现在正在考虑的一种可能的解决方案是有一个步骤 3a,其中文件的 fddup()为每个子进程分配一次,每个子进程都有自己的 fd(作为argv)。然后每个子程序都会简单地close()使用他们的 fd,以便在所有指向文件的 fd 都是close()d 之后,“实际文件”被关闭。

但它是这样工作的吗?这样做是否安全(即文件是否真的关闭了)?如果没有,是否有另一种/更好的方法?

0 投票
1 回答
1427 浏览

python - PyDev 和 settrace 静默中断

我正在尝试调试 Python 子进程(使用多进程启动)。我只使用以下代码创建了一个更简单的项目,启动了远程调试器,然后启动了该项目。我希望 Eclipse 能够打破 settrace 语句。

我看到了第一个打印语句的输出,但没有看到第二个,并且没有执行中断。

然后我用 False 发送 settrace() 的“suspend”参数。

这一次,我按预期看到了两条消息。然后我在第二个打印语句上设置了一个断点,然后再次运行。现在,我不再看到第二条消息。

因此,看起来 Eclipse 在它应该的时候中断了执行,但没有将控制权交还给我。有什么我想念的吗?

0 投票
2 回答
367 浏览

python-2.6 - 虽然循环正在中断将值传递给python进程中的变量

我一直在尝试了解多处理在 python 中的工作原理,并创建了一个非常简单的脚本来测试我的理解。

一切似乎都工作正常,除了在一个进程中,在 while 循环之后发生的任何值分配似乎都没有完成。

如果我用 for 循环替换 while 循环,或者完全删除它,一切似乎都按预期工作。

这是main.py:

timepieces.py 文件(包含创建和控制进程的类):

任何想法表示赞赏。

0 投票
1 回答
492 浏览

ruby - 如何使用 ruby​​ net-sftp 异步(并行)上传文件

使用 sftp 并行上传文件的最佳方法是什么?
使用多线程和多进程是唯一的选择吗?
我们可以为此使用任何宝石吗?
我使用红宝石 1.8.6。

0 投票
0 回答
292 浏览

python - 使用多进程时在鼻子插件上获取加载程序

我们有一个鼻子插件,用于loadTestsFromTestClass从成员方法动态生成测试用例。不幸的是,当您尝试使用多进程插件运行测试时,我们的插件会崩溃,因为多进程插件使用 加载子进程中的所有测试loadTestsFromNames,从而完全绕过我们在父进程中运行的所有动态生成以生成要运行的名称. 我一直在努力解决这个问题,但遇到了问题。

我们使用prepareTestLoader钩子将加载器存储到插件的每个实例中,我想在其中使用加载器loadTestsFromName(这个基本模式也用于内置isolate插件)。问题是prepareTestLoader钩子似乎只被触发core.TestProgram.parseArgs,工作进程甚至根本不创建TestPrograms,所以当工作人员点击我的loadTestsFromName钩子时,他们提出了一个AttributeError从未prepareTestLoader调用过的函数,因此加载程序从未添加到插件中实例。

我确实有测试名称,它又具有模块路径,所以我可以尝试使用来获取模块,然后从那里进行动态加载,但如果可能的话nose.importer.Importer,我宁愿保持在更高的级别。nose有没有人有任何想法或经验,除了直接修改nose以直接从内部发射prepareTestLoader钩子nose.plugins.multiprocess.__runner吗?

编辑:loadTestsFromTestClass我破解了一种解决方法,通过调用从当我有一个模块并且可以在其上找到与测试名称的第一部分匹配的属性 来动态加载测试loadTestsFromName,但我无法真正测试它,因为loadTestsFromTestClass依赖于loader.makeTest我还是没有感谢原来的问题。我真的需要一些在测试加载之前在子进程中运行的钩子,该钩子在范围内具有加载器和插件实例......