zoukankan      html  css  js  c++  java
  • 转 Python 多进程multiprocessing.Process之satrt()和join()

    1、

    https://blog.csdn.net/wonengguwozai/article/details/80325745

    今天项目中涉及到了使用多进程处理数据,在廖雪峰的python教程上学习了一下多进程相关,其中涉及到了start和join函数,解释的不是很清晰,在网上找了博客,敲了下博客提供的代码,瞬间理解了。感谢原文:https://blog.csdn.net/HeatDeath/article/details/72842899

    由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。

    multiprocessing模块就是跨平台版本的多进程模块。

    multiprocessing模块提供了一个Process类来代表一个进程对象。

    创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例

    start()方法启动,这样创建进程比fork()还要简单。

    join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。(进一步地解释,哪个子进程调用了join方法,主进程就要等该子进程执行完后才能继续向下执行,具体可见下边的分析图)

    使用 join()

    1.  
      # -*- coding:utf-8 -*-
    2.  
      from multiprocessing import Process
    3.  
      import os
    4.  
      import time
    5.  
       
    6.  
       
    7.  
      def run_proc(name):
    8.  
      time.sleep(10)
    9.  
      print('Run child process %s (%s)...' % (name, os.getpid()))
    10.  
       
    11.  
       
    12.  
      def hello_world():
    13.  
      # time.sleep(5)
    14.  
      time.sleep(20)
    15.  
      print('hello world!')
    16.  
      print('Run child process (%s)...' % (os.getpid()))
    17.  
       
    18.  
       
    19.  
      if __name__ == '__main__':
    20.  
      print ('Parent process %s.' % os.getpid())
    21.  
      p1 = Process(target=run_proc, args=('test',))
    22.  
      p2 = Process(target=hello_world)
    23.  
      print 'Process will start.'
    24.  
      p1.start()
    25.  
      p2.start()
    26.  
      p1.join()
    27.  
      print('Process end.')

    输出:

    1.  
      Parent process 11860.
    2.  
      Process will start.
    3.  
      Run child process test (11232)...
    4.  
      Process end.
    5.  
      hello world!
    6.  
      Run child process (2288)...
    7.  
       
    8.  
      Process finished with exit code 0
    • 这里写图片描述

    子进程的开始时间

    1.  
      # -*- coding:utf-8 -*-
    2.  
      from multiprocessing import Process
    3.  
      import os
    4.  
      import time
    5.  
       
    6.  
       
    7.  
      def run_proc(name):
    8.  
      print(time.time())
    9.  
       
    10.  
      time.sleep(10)
    11.  
      print('Run child process %s (%s)...' % (name, os.getpid()))
    12.  
       
    13.  
       
    14.  
      def hello_world():
    15.  
      print(time.time())
    16.  
       
    17.  
      # time.sleep(5)
    18.  
      time.sleep(20)
    19.  
      print('hello world!')
    20.  
      print('Run child process (%s)...' % (os.getpid()))
    21.  
       
    22.  
       
    23.  
      if __name__ == '__main__':
    24.  
      print ('Parent process %s.' % os.getpid())
    25.  
      p1 = Process(target=run_proc, args=('test',))
    26.  
      p2 = Process(target=hello_world)
    27.  
      print 'Process will start.'
    28.  
      p1.start()
    29.  
      p2.start()
    30.  
      p1.join()
    31.  
      print('Process end.')

    输出:

    1.  
      Parent process 7220.
    2.  
      Process will start.
    3.  
      1496374096.56
    4.  
      1496374096.56
    5.  
      Run child process test (2196)...
    6.  
      Process end.
    7.  
      hello world!
    8.  
      Run child process (832)...
    9.  
       
    10.  
      Process finished with exit code 0

    可以认为 子进程 p1 与 子进程 p2 同时开始


    去掉 join(),使用 map

    1.  
      # -*- coding:utf-8 -*-
    2.  
      from multiprocessing import Process
    3.  
      import os
    4.  
      import time
    5.  
       
    6.  
       
    7.  
      def run_proc(name):
    8.  
      print(time.time())
    9.  
       
    10.  
      time.sleep(10)
    11.  
      print('Run child process %s (%s)...' % (name, os.getpid()))
    12.  
       
    13.  
       
    14.  
      def hello_world():
    15.  
      print(time.time())
    16.  
       
    17.  
      # time.sleep(5)
    18.  
      time.sleep(20)
    19.  
      print('hello world!')
    20.  
      print('Run child process (%s)...' % (os.getpid()))
    21.  
       
    22.  
       
    23.  
      if __name__ == '__main__':
    24.  
      print ('Parent process %s.' % os.getpid())
    25.  
      p1 = Process(target=run_proc, args=('test',))
    26.  
      p2 = Process(target=hello_world)
    27.  
      print 'Process will start.'
    28.  
      # p1.start()
    29.  
      # p2.start()
    30.  
      # p1.join()
    31.  
      p_list = (p1, p2)
    32.  
      map(Process.start, p_list)
    33.  
      print('Process end.')

    输出:

    1.  
      Parent process 8580.
    2.  
      Process will start.
    3.  
      Process end.
    4.  
      1496374397.24
    5.  
      1496374397.24
    6.  
      Run child process test (7148)...
    7.  
      hello world!
    8.  
      Run child process (8348)...
    9.  
       
    10.  
      Process finished with exit code 0
    11.  

    2.

    https://blog.csdn.net/yagamil/article/details/51284851


    threads=[]
    f=[fast,slow]
    l=len(f)
    for i in range(l):
    t=MyThread(f[i],(),str(i))
    threads.append(t)

    for i in range(l):
    threads[i].start()

    for i in range(l):
    #pass
    threads[i].join()
    print threads[i].getName()
    print "Done on main"
    exit()

    join的主要功能是阻塞线程,也就是使用了join后,后面的语句需要等当前进程完成之后才能 执行。


    那么看看下面的例子

    class MyThread(threading.Thread):
    def __init__(self,fun,arg,name=""):
    threading.Thread.__init__(self)
    self.fun=fun
    self.arg=arg
    self.name=name
    #self.result


    def run(self):
    self.result=apply(self.fun,self.arg)

    def getName(self):
    return self.name


    def getResult(self):
    return self.result

    上面是一个多线程的类。 待会用来调用的。
    下面是main函数

    def fast():
    print "in fast"
    sleep(15)
    print "done in fast"

    def slow():
    print "in slow"
    sleep(10)
    print "done in slow"

    threads=[]
    f=[fast,slow]
    l=len(f)
    for i in range(l):
    t=MyThread(f[i],(),str(i))
    threads.append(t)

    for i in range(l):
    threads[i].start()

    for i in range(l):
    #pass
    threads[i].join()
    print threads[i].getName()
    print "Done on main"
    exit()


    运行之后
    输出的结果是

    in fast
    in slow
    done in slow
    done in fast
    0
    1
    Done on main


    看到了吗?

    运行到thread[i].join() 这一行, 下一句没有马上被执行,需要等到done in fast 完成之后才执行, 而为什么done in slow却提前被执行了呢?

    因为上面执行了threads[i].start() 后 两个线程已经同时开启了,但是由于在slow线程里只sleep了10秒,而fast线程sleep了15秒,所以会先打印done in slow。

    print threads[i].getName()

    而上面这句则需要等线程1执行之后才会执行,

    等执行完了上面那句之后,才会执行线程2的 join(), 由于此时的线程已经早已执行完毕,所以这句也没有起到阻塞作用,故会马上执行 下面只一句

    print threads[i].getName()
    ---------------------
    作者:重复的生活
    来源:CSDN
    原文:https://blog.csdn.net/yagamil/article/details/51284851
    版权声明:本文为博主原创文章,转载请附上博文链接!

    转载于:https://www.cnblogs.com/feiyun8616/p/10444793.html

  • 相关阅读:
    项目配置64位Release版,编译提示:TRACKER : 错误 TRK0005: 未能找到: “CL.exe”。系统找不到指定的文件。
    解决word表格中换行到最后一行不分页以及分页后在最后一行回车后增加一个新页页不是与其它内容共用一页
    Qt error: undefined reference to `vtable for XXX'
    C++中string转int
    U盘在linux下出现加锁解决办法
    Qt执行没崩溃,但是也不往下走,一调式出现Signal Received错误
    工具里调整视图切换新结构后调用表格的importfile会崩溃
    treectrl关联了一个右键弹出菜单,但是一执行到GetSubMenu(0)就崩溃
    java中lock和synchronized区别
    http 状态码
  • 原文地址:https://www.cnblogs.com/twodog/p/12135129.html
Copyright © 2011-2022 走看看