python multiprocessing join_转 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()

# -*- coding:utf-8 -*-

from multiprocessing import Process

import os

import time

defrun_proc(name):

time.sleep(10)

print('Run child process %s (%s)...' % (name, os.getpid()))

defhello_world():

# time.sleep(5)

time.sleep(20)

print('hello world!')

print('Run child process (%s)...' % (os.getpid()))

if __name__ == '__main__':

print ('Parent process %s.' % os.getpid())

p1 = Process(target=run_proc, args=('test',))

p2 = Process(target=hello_world)

print 'Process will start.'

p1.start()

p2.start()

p1.join()

print('Process end.')

输出:

Parent process 11860.

Process will start.

Run child process test (11232)...

Process end.

hello world!

Run child process (2288)...

Process finished with exit code 0

子进程的开始时间

# -*- coding:utf-8 -*-

from multiprocessing import Process

import os

import time

defrun_proc(name):

print(time.time())

time.sleep(10)

print('Run child process %s (%s)...' % (name, os.getpid()))

defhello_world():

print(time.time())

# time.sleep(5)

time.sleep(20)

print('hello world!')

print('Run child process (%s)...' % (os.getpid()))

if __name__ == '__main__':

print ('Parent process %s.' % os.getpid())

p1 = Process(target=run_proc, args=('test',))

p2 = Process(target=hello_world)

print 'Process will start.'

p1.start()

p2.start()

p1.join()

print('Process end.')

输出:

Parent process 7220.

Process will start.

1496374096.56

1496374096.56

Run child process test (2196)...

Process end.

hello world!

Run child process (832)...

Process finished with exit code 0

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

去掉 join(),使用 map

# -*- coding:utf-8 -*-

from multiprocessing import Process

import os

import time

defrun_proc(name):

print(time.time())

time.sleep(10)

print('Run child process %s (%s)...' % (name, os.getpid()))

defhello_world():

print(time.time())

# time.sleep(5)

time.sleep(20)

print('hello world!')

print('Run child process (%s)...' % (os.getpid()))

if __name__ == '__main__':

print ('Parent process %s.' % os.getpid())

p1 = Process(target=run_proc, args=('test',))

p2 = Process(target=hello_world)

print 'Process will start.'

# p1.start()

# p2.start()

# p1.join()

p_list = (p1, p2)

map(Process.start, p_list)

print('Process end.')

输出:

Parent process 8580.

Process will start.

Process end.

1496374397.24

1496374397.24

Run child process test (7148)...

hello world!

Run child process (8348)...

Process finished with exit code 0

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()

---------------------

作者:重复的生活

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值