python 多进程的启动和代码执行顺序

对照着廖雪峰的网站学习Python遇到些问题:

在进程中,父进程创建子进程时发现,显示不是按照顺序显示,疑问?

参照代码如下:  

 1 from multiprocessing import Pool
 2 import os, time, random
 3
 4 def long_time_task(name):
 5     print ‘Run task %s (%s)...‘ % (name, os.getpid())
 6     start = time.time()
 7     time.sleep(random.random() * 3)
 8     end = time.time()
 9     print ‘Task %s runs %0.2f seconds.‘ % (name, (end - start))
10
11 if __name__==‘__main__‘:
12     print ‘Parent process %s.‘ % os.getpid()
13     p = Pool()
14     for i in range(5):
15         p.apply_async(long_time_task, args=(i,))
16     print ‘Waiting for all subprocesses done...‘
17     p.close()
18     p.join()
19     print ‘All subprocesses done.‘

运行结果:

  可以看出代码执行是从if __name__==‘__main__‘开始执行,在执行15行调用long_time_task后,没有打印‘Run task %s (%s)...‘。

  但是在15行p.apply_async(long_time_task, args=(i,)),加入 print ‘??’,会在‘Waiting for all subprocesses done...‘,之前,打印‘’??‘’对这个很疑惑。

修改代码,让每个打印时,打印出时间:

 1 from multiprocessing import Pool
 2 import os, time, random
 3
 4 def long_time_task(name):
 5     print ‘Run task %s (%s) at %f...‘ % (name, os.getpid(),time.time())
 6     start = time.time()
 7     time.sleep(random.random() * 3)
 8     end = time.time()
 9     print ‘Task %s runs %0.2f seconds.‘ % (name, (end - start))
10
11 if __name__==‘__main__‘:
12     print ‘Parent process %s.‘ % os.getpid()
13     p = Pool()
14     for i in range(5):
15         p.apply_async(long_time_task, args=(i,))
16         print ‘time:%s:‘ %time.time()
17     print ‘parent: %f‘ %time.time()
18     print ‘Waiting for all subprocesses done...‘
19     p.close()
20     p.join()
21     print ‘All subprocesses done.‘
22     

运行结果:

这样就找到原因了:

  ps:在新代码中将原来的代码中long_time_task()创建子进程中的sleep删去。

  parent首先运行,在调用刚创建子进程时,创建子进程已经创建好,然后继续执行后序代码,当子进程创建好后,显示子进程。

  就是说子进程创建需要时间,在这个空闲时间,父线程继续执行代码,子进程创建完成后显示。

时间: 2024-08-13 21:50:20

python 多进程的启动和代码执行顺序的相关文章

当C#中带有return的TryCatch代码遇到Finally时代码执行顺序

编写的代码最怕出现的情况是运行中有错误出现,但是无法定位错误代码位置.综合<C#4.0图解教程>,总结如下: TryCatchFinally用到的最多的是TryCatch,Catch可以把Try代码块的错误捕捉到,并对错误进行后续处理.这一点比较常见. 现在要讨论的是如果Try和Catch代码块有return时代码的执行顺序.众所周知,return的作用是退出当前函数,不执行return后面的代码.那么问题来了:如果return出现在Try或catch代码块中,并且return后面还有代码,则

final、static、代码块、静态代码块、内部类、代码执行顺序

final final域使得确保初始化安全性(initialization safety)成为可能,初始化安全性让不可变形对象不需要同步就能自由地被访问和共享 作用在类上               则为final类,final类不能被继承.一般用于工具类时,同时把工具类构造函数声明为私有,暴露静态共有方法 作用在成员变量上    则视为常量.此时赋值方式有三种:(1)声明时赋值(2)构造函数中赋值(3)代码块中赋值. 即不管哪种方式都要保证在使用该变量之前要确保已经有值.使用该特性,可以强制赋

javascript--函数的声明及调用/JS中代码执行顺序

[函数的声明及调用] 1.函数声明格式: function 函数名(参数1,参数2,参数3--){ //函数体 return 结果: } 函数调用的格式: 函数名(参数1的值,参数2的值,--): 事件调用:事件名=函数名(): 2.函数声明的几点强调: ① 函数的声明,必须符合小驼峰法则(首字母小写,之后每个单词首字母大写): ② 参数的列表,可以有参数,可以无参数.分别称为有参函数,无参函数: ③ 声明函数时的参数列表,称为"形参列表"(变量的名): 调用函数时的参数列表,称为&q

浏览器环境下JavaScript脚本加载与执行探析之代码执行顺序

本文主要基于向HTML页面引入JavaScript的几种方式,分析HTML中JavaScript脚本的执行顺序问题 1. 关于JavaScript脚本执行的阻塞性 JavaScript在浏览器中被解析和执行时具有阻塞的特性,也就是说,当JavaScript代码执行时,页面的解析.渲染以及其他资源的下载都要停下来等待脚本执行完毕①.这一点是没有争议的,并且在所有浏览器中的行为都是一致的,原因也不难理解:浏览器需要一个稳定的DOM结构,而JavaScript可能会修改DOM(改变DOM结构或修改某个

java复习基础篇——代码执行顺序

代码块:在Java中,使用{}括起来的代码成为代码块 根据其位置和声明的不同,可以分为局部代码块:局部位置,用于限定变量的生命周期 构造代码块:在类中的成员位置,用{}括起来的代码.每次调用构造方法执行前,都会先执行构造代码块. 作用:可以把多个构造方法的共同代码放在一起. 静态代码块:在类中的成员位置,用{}括起来的代码,只不过它用static修饰 作用:一般是对类进行初始化 public class BlockTest { { System.out.println("444 BlockTes

java中代码执行顺序

之前面试的时候有一道题,是考java的代码执行顺序的. 在大三的时候学习java语言的时候有说,但是在实际工作中用的比较少,所以在这里重新记录复习一下. 比如下面这段代码: class helloA{ public helloA(){ System.out.println("helloA"); } { System.out.println("I'm A"); } static { System.out.println("Static A"); }

python unittest控制用例的执行顺序

为什么要进行顺序控制呢?使用过testng的同学就知道,它相对于junit来说有更强大的功能,其中的一个功能就是依赖测试.什么是依赖测试呢?简单的说一下就是,A方法运行时,其中有个变量的取值是B方法的动态产出值.这样就必须先执行B方法.testng的test方法有dependson属性来制定方法的依赖.但是向python的unittet框架,他类似于junit,没有依赖测试的功能.unittest的main()方法执行用例的顺序是按照测试类.测试方法的名字的ASCII顺序来执行测试方法.如果想要

javaScript代码执行顺序

javaScript是一种描述型脚本语言,由浏览器进行动态的解析和执行. 页面加载过程中,浏览器会对页面上载入的每个js代码块进行扫描. JavaScript是一段一段的分析执行的,在分析执行同一段代码中,定义式函数会 被提取出来优先执行.函数定义执行完毕后,才会按顺序执行其他代码. 一.代码块 JavaScript代码块是由一对script开始标签和结束标签包裹的一段代码. JavaScript是按照代码块来进行编译和执行的,代码块之间相互独立,但是前面执行的变量和方法,后面的代码块可以使用.

ASP.net页面代码执行顺序

<%=TextBox1 .Text%> <asp:TextBox ID="TextBox1" runat="server">abc</asp:TextBox> <%TextBox1.Text = "A"; %> <%=TextBox1 .Text%> 效果如下: 执行顺序如下:这些代码在Page_Load事件里执行,相当于添加事件的末尾执行,此时TextBox已被初始化, 首先,输出Te