问题标签 [multiprocessing]

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 回答
7978 浏览

python - Python多处理简单的方法来实现一个简单的计数器?

大家好,我现在在 python 中使用多处理。我只是想知道是否存在某种简单的计数器变量,每个进程在完成处理某些任务时可以增加(有点像总共完成了多少工作)。

我查找了 Value 的 API,不认为它是可变的。

0 投票
2 回答
8191 浏览

python - Python多处理退出错误

当我按 Ctrl-C 退出我的应用程序时,我看到了这个

我在自己的东西上使用扭曲,

我使用以下代码注册了信号 Ctrl-C

当他们向其他人发出关闭的信号时,它会试图告诉他们很好地关闭

我所有的流程都以某种形式存在,

知道这个错误是什么吗?只有当我有多个特定线程的实例时,我才会得到它。

0 投票
5 回答
10432 浏览

python - python multiprocessing vs threading for cpu bound work on windows and linux

所以我敲了一些测试代码,看看多处理模块与线程相比如何在 cpu 绑定工作上进行扩展。在 linux 上,我得到了预期的性能提升:

我的双核 macbook pro 显示相同的行为:

然后我去 Windows 机器上试了一下,得到了一些非常不同的结果。

为什么哦,为什么,Windows 上的多处理方法要慢得多?

这是测试代码:

0 投票
1 回答
5802 浏览

locking - accept() 在多个进程之间共享套接字(基于 Apache 预分叉)

我正在研究一些以 Apache 的 MPM prefork 服务器为模型的 Python 代码。我更像是一名应用程序程序员而不是网络程序员,自从我阅读 Stevens 以来已经 10 年了,所以我正在努力加快理解代码的速度。

我找到了Sander Temme 对 Apache 的 prefork 代码如何工作的简短描述。

通常以 root 身份运行的父进程绑定到一个套接字(通常是端口 80 或 443)。它产生子节点,继承套接字的打开文件描述符,并将 uid 和 gid 更改为非特权用户和组。孩子们构造一个监听器文件描述符的轮询集(如果有多个监听器)并观察它/它们上的活动。如果找到活动,则子进程在活动套接字上调用 accept() 并处理连接。完成后,它会返回查看轮询集(或侦听器文件描述符)。

由于多个子节点处于活动状态并且它们都继承了相同的套接字文件描述符,因此它们将监视相同的轮询集。一个接受互斥体只允许一个孩子实际观看轮询集,一旦找到一个活动套接字,它将解锁互斥体,以便下一个孩子可以开始观看轮询集。如果只有一个侦听器,则不使用该接受互斥体,并且所有子级都将挂在接受()中。

这几乎就是我正在查看的代码的工作方式,但我不明白一些事情。

1)“孩子”和“听众”有什么区别?我认为每个孩子都是一个听众,这对于我正在查看的代码来说是正确的,但是在 Temme 的描述中可以有“单个听众”和“孩子”。一个孩子什么时候会有多个听众?

2)(与 1 相关)这是每个进程的互斥锁还是系统互斥锁?就此而言,为什么要有互斥锁?不接受(2)在所有听众中做自己的互斥锁吗?我的研究表明我确实需要一个互斥锁,并且该互斥锁必须跨越整个系统。(群、信号量等)

泰姆接着说:

当他们最后一次服务请求时,孩子们会在共享内存区域(记分板)中记录。空闲子进程可能会被父进程杀死以满足 MaxSpareServers。如果空闲的子节点太少,父节点将产生子节点以满足 MinSpareServers。

3)这个实现有没有很好的参考代码(最好是Python)?我找到了 Perl 的Net::Server::Prefork,它使用管道而不是共享内存作为记分牌。我发现了Randal Schwartz的一篇文章,它只做预分叉,但不做记分牌。

Perl Cookbook中的pre-fork 示例没有围绕 select 进行任何类型的锁定,Chris Siebenmann 的 Python 示例说它基于 Apache,但使用配对套接字作为记分板,而不是共享内存,并使用套接字进行控制,包括控制给定的孩子“接受”。这根本不符合 Apache 的描述。

0 投票
2 回答
1953 浏览

python - 具有可再生队列的多处理

我试图弄清楚如何在 python 中编写一个使用多处理队列的程序。

我有多台服务器,其中一台将远程提供队列:

现在我想使用我的双 Xeon 四核服务器来处理来自这个远程队列的作业。这些工作完全相互独立。因此,如果我有 8 个内核,我想启动 7 个进程,从队列中挑选一个作业,处理它,然后返回下一个。7 个进程中的每一个都会执行此操作,但我无法完全理解该程序的结构。

谁能给我一些关于这个基本结构的有根据的想法?

先感谢您。

0 投票
1 回答
658 浏览

python - 用于 Windows 上的批量文件/转换操作的 Python 多处理

我编写了一个 python 脚本,它监视新子目录的目录,然后循环作用于每个子目录。我们有一个创建这些子目录的外部进程。每个子目录中都有一个文本文件和一些图像。每个图像的文本文件中有一个记录(行)。对于每个子目录,我的脚本扫描文本文件,然后调用一些外部程序,一个检测空白图像(自定义 exe),然后调用“mogrify”(ImageMagick 的一部分)调整图像大小并转换图像,最后调用 7 -zip 将所有转换后的图像和文本文件打包到一个存档中。

该脚本运行良好,但目前是连续的。一次循环遍历每个子目录。在我看来,这将是进行多处理的好机会,因为这是在双 CPU 机器(总共 8 个内核)上运行的。

给定子目录的处理独立于所有其他子目录……它们是自包含的。

目前,我只是使用调用 os.listdir() 创建子目录列表,然后循环遍历该列表。我想我可以将所有每个子目录的代码(转换等)移动到一个单独的函数中,然后以某种方式创建一个单独的进程来处理每个子目录。由于我对 Python 有点陌生,因此将不胜感激有关如何处理这种多处理的一些建议。我在运行 Python 2.6 的 Vista x64 上。

0 投票
2 回答
14167 浏览

python - 多处理调试技术

我在调试多进程应用程序时遇到问题(特别是在 python 的多处理模块中使用进程池)。我有一个明显的僵局,我不知道是什么原因造成的。堆栈跟踪不足以描述该问题,因为它仅显示多处理模块中的代码。

是否有任何 python 工具或其他用于调试死锁的通用技术?

0 投票
3 回答
2297 浏览

python - 用于多处理、设计问题的 RPC

跨 multiprocessing.Process'es 执行 rpc 的好方法是什么?

我也愿意就以下架构提供设计建议:进程 A * 10,进程 B * 1。每个进程 A 必须与进程 B 核对是否需要查询特定项目。

所以我正在考虑为所有的 As 实现 multiprocessing.Pipe() 对象,然后让 B 监听它们中的每一个。但是,我意识到 Multiprocessing.Pipe.recv 是阻塞的。所以我真的不知道我该怎么做。(如果我使用循环来检查哪个有东西通过另一端发送,则循环将被阻塞)。

有人建议我使用twisted,但我不确定我应该如何在twisted 中执行此操作:我是否应该在所有进程A 的每个pipe.handler 上创建一个defer,然后当recv() 接收到它继续进行时并完成一定的套路?我个人知道twisted 不能很好地与多处理混合,但是我已经对作为多处理实现的子进程的twisted 进行了一些测试,我认为这次它是可行的。

有什么建议吗?

0 投票
6 回答
5641 浏览

python - 如何在 Python 中实现多处理优先级队列?

任何熟悉我如何在 python 中实现多处理优先级队列的人?

0 投票
6 回答
4706 浏览

python - 在 python 守护程序中使用多处理模块时出错

在 python 守护进程(使用python-daemon )中使用多处理模块时出现以下错误:

守护进程(父进程)产生许多进程(子进程),然后定期轮询这些进程以查看它们是否已完成。如果父进程检测到其中一个进程已完成,则它会尝试重新启动该进程。正是在这一点上引发了上述异常。似乎一旦其中一个进程完成,任何涉及多处理模块的操作都会生成此异常。如果我在非守护进程 python 脚本中运行相同的代码,它执行时不会出现任何错误。

编辑:

示例脚本