- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
用for循环启动多进程。
import os
from multiprocessing import Process
def run_proc(name):
print('child process %s (%s) running ...' %(name,os.getpid()))
if __name__ == '__main__':
print('parent process %s.' %os.getppid())
for i in range(5):
p = Process(target=run_proc,args=(str(i),))
print('process will start'+str(i))
p.start()
p.join()
print('process is end')
我得到了结果。
parent process 6497.
process will start
process will start
child process 0 (6984) running ...
process will start
process will start
process will start
child process 2 (6986) running ...
child process 1 (6985) running ...
child process 3 (6987) running ...
child process 4 (6988) running ...
process is end
为什么早创建的子流程后执行?
为什么得不到下面的结果?
parent process 6497.
process will start
process will start
child process 0 (6984) running ...
process will start
process will start
process will start
child process 1 (6986) running ...
child process 2 (6985) running ...
child process 3 (6987) running ...
child process 4 (6988) running ...
process is end
Jean-François Fabre 所说的是关于如何创建以下结果:
parent process 6497.
process will start
child process 0 (9639) running ...
process will start
child process 1 (9640) running ...
process will start
child process 2 (9641) running ...
process will start
child process 3 (9643) running ...
process will start
child process 4 (9644) running ...
process is end
我可以得到它只是改变 p.join 在 for 循环中,如下所示:
import os
from multiprocessing import Process
def run_proc(name):
print('child process %s (%s) running ...' %(name,os.getpid()))
if __name__ == '__main__':
print('parent process %s.' %os.getppid())
for i in range(5):
p = Process(target=run_proc,args=(str(i),))
print('process will start'+str(i))
p.start()
p.join()
print('process is end')
我想知道为什么我的代码会产生以下输出
parent process 6497.
process will start
process will start
child process 0 (6984) running ...
process will start
process will start
process will start
child process 2 (6986) running ...
child process 1 (6985) running ...
child process 3 (6987) running ...
child process 4 (6988) running ...
process is end
代替:
parent process 6497.
process will start
process will start
child process 0 (6984) running ...
process will start
process will start
process will start
child process 1 (6986) running ...
child process 2 (6985) running ...
child process 3 (6987) running ...
child process 4 (6988) running ...
process is end
这是一个不同的问题。
最佳答案
这里有一个 race condition在创建流程的主流程与尝试启动的流程(以及子流程本身)之间。
只要您从主进程发出 p.start()
命令,子进程就可以运行(并打印)。但是主进程也在努力创建下一个子进程。谁将首先打印下一行?很难知道。如果主进程成功创建了下一个子进程,那么现在两个子进程之间存在竞争条件:您正在经历什么。
进程可以并行运行,但它们在调用操作系统时仍然有同步点。谁先到达操作系统,谁就先得到服务(例如:打印到控制台)。
当然,将p.join()
放在循环中可以恢复顺序,同时也取消了多处理的效果,因为主进程等待直到子进程在创建另一个之前结束。
这通常无关紧要,因为您正在执行一些并行任务。
我会首先在列表推导式中创建进程,然后循环启动它们,并稍作延迟以确保进程在创建下一个进程之前启动并打印。
process_list = [Process(target=run_proc,args=(str(i),)) for i in range(5)]
for i,p in enumerate(process_list):
print('process {} will start'.format(i))
p.start()
time.sleep(0.1)
当主进程稍等片刻时,这会为子进程提供喘息空间以启动和打印。
另请注意,您的最后一个 p.join()
只是加入循环的最后一个进程,它应该是(现在使用我们全新的 process_list
):
for p in process_list:
p.join()
在大多数情况下,按顺序开始/结束并不重要。您可以预先计算主流程中的所有排序信息(就像您通过为流程名称分配递增的数字所做的那样)。
请注意,经典问题可能不是确保进程按顺序启动,而是它们产生的结果可以与您提供的输入相匹配(向进程传递输入列表,它们产生输出列表,所以最后你知道哪个输入提供了哪个输出)。
在这种情况下,寻找 multiprocessing.pool
和 map
函数 ( Python multiprocessing.pool sequential run of processes )
关于python - 多进程模块中子进程的运行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48208387/
我正在使用 Make,并且有一个 makefile,它设置了一个变量,该变量的值需要我从父 makefile 覆盖。我尝试在父 makefile 中设置变量并使用 export 将其传递给子 make
全屏运行下面的代码片段并调整屏幕大小以查看最后一行中的图像如何堆叠/环绕。它们直接包裹在下一行的正中央。我希望它们向左环绕。 #instafeed{ text-align: center; } #
我在这个网站上找到了以下 jsfiddle,它 90% 回答了我的查询。 JSFiddle 但是我希望能够在内部 div 上包含边距。我已经尝试修改计算以考虑边距,但如果内部 div 不换行或溢出,我
我有 div(class name:xyz) 在其中插入小的 4 div (class name:ax )。我需要垂直插入前两个 div,第三个应该水平插入第一个,第四个应该垂直插入第三个。但是所有的
我有一些动态添加的 QWidgets,我想在它们发生变化时执行一些任务。 我想我不能使用 connect() 因为我还需要触发更改的 QWidget 的名称。 我如何才能同时查看更改了哪个 QWidg
我想在子操作中生成 HTML head 部分;而该页面还有许多其他子操作。 html head 部分取决于其他操作来确定应包含哪些 js/css 文件。不同的子 Action 可以共享同一个js/cs
我正在构建一个 Angular 7 应用程序。我想获取父 div 中某个 div 的“索引”或行。 我的标记如下所示: 我知道如果标记如下所示,我可以轻松做到这一点,但如果
如果我在 Ruby 中调用系统方法,它将在子 shell 中执行我的命令并输出它可以输出的所有内容。因此,如果我将其放入 file.rb 中: system 'vim' 然后运行 $ ruby
我可以对齐两个 div只需设置他们的 display至 inline-block并使用相同的 line-height如下图所示: 但是,我想要的是根据内部 div 的基线对齐两个嵌套 div,如下所示
我的父 Controller 上有一些属性,我希望我的子 Controller 可以访问这些属性。 我想像这样访问它: App.ApplicationController = Ember.Object
我有一个容器 div,里面有一个 SVG: 以及以下 CSS: svg { width: 100%; height: 1
我必须处理的事件目录是这样布置的:域包含许多 OU。这些 OU 之一被命名为“主 OU”。在这个 OU 中,有几个以全局办事处位置命名的 OU(即“芝加哥”“巴黎”)。 任何实际有血有肉的用户帐户都被
我在 NSBox 中有一个 NSTextView。我想每当 NSTextView 获得焦点时在 NSBox 周围绘制焦点环,并在 NSTextView 失去焦点时立即删除焦点环。 谢谢 最佳答案 为此
在下面的代码中,我有一个链接,其 div id 是“my-acc-hover-container”。当用户将鼠标悬停在该链接上时,一个新的部分将向下滑动,其中包含“Hello Guest”和“Logi
我正在使用 javafx 创建一个像 sqlyog 这样的应用程序。我的问题是我想添加数据库。无论何时添加,它都应该更新具有所有其他数据库的 TreeView 。出现创建数据库的对话框,给出名称并设置
我的 UIScrollView 中有几个屏幕的内容,它只能垂直滚动。 我想以编程方式滚动到包含在其层次结构中某处的 View 。 UIScrollView 移动以便 subview 位于 UIScro
我想更新已创建端口的 vif_model。我在 CLI 中使用以下命令 neutron port-update --binding:vif_model=avp 如何使用 neutron 的 pyth
我在一个程序中有两个查询。 查询1:我正在尝试在容器 div 的子 div 内水平对齐两个子 super 子分区。下面是我的代码,你能帮我解决这个问题吗?我已附上所需的输出。 查询2:从代码中你可以看
我在一个程序中有两个查询。 查询1:我正在尝试在容器 div 的子 div 内水平对齐两个子 super 子分区。下面是我的代码,你能帮我解决这个问题吗?我已附上所需的输出。 查询2:从代码中你可以看
我是一名优秀的程序员,十分优秀!