python多进程 multiprocessing 模块
1.没有多进程的版本
os.getpid() # 获取当前进程的pid
#coding:utf-8
import time
import os
def work_a():
for i in range(10):
print(i,'a',os.getpid())
time.sleep(1)
def work_b():
for i in range(10):
print(i,'b',os.getpid())
time.sleep(1)
if __name__ == '__main__':
start = time.time();
work_a()
work_b()
print(time.time() - start) # 大概 20s
print('parent pid is %d' % os.getpid()) # 输出结果可以看到 三个进程号都是一样的
2.把 work_a() 单独开一个进程
#coding:utf-8
import time
import os
import multiprocessing
def work_a():
for i in range(10):
print(i,'a',os.getpid())
time.sleep(1)
def work_b():
for i in range(10):
print(i,'b',os.getpid())
time.sleep(1)
if __name__ == '__main__':
start = time.time();
a_p = multiprocessing.Process(target=work_a)
a_p.start()
work_b()
print(time.time() - start) # 大概 20s
print('parent pid is %d' % os.getpid())
#可以看到 parent 的进程号和 work_b()是一样的,work_a() 是另外一个进程号。
3.把 work_a() 和 work_b() 都单独开一个进程
#coding:utf-8
import time
import os
import multiprocessing
def work_a():
for i in range(10):
print(i,'a',os.getpid())
time.sleep(1)
def work_b():
for i in range(10):
print(i,'b',os.getpid())
time.sleep(1)
if __name__ == '__main__':
start = time.time();
a_p = multiprocessing.Process(target=work_a)
#a_p.start()
b_p = multiprocessing.Process(target=work_b)
#b_p.start()
for p in (a_p,b_p):
p.start()
print('时间消耗:',time.time() - start) # 大概 0.2s
print('parent pid is %d' % os.getpid())
4.work_a() 和 work_b() join() 阻塞
#coding:utf-8
import time
import os
import multiprocessing
def work_a():
for i in range(10):
print(i,'a',os.getpid())
time.sleep(1)
def work_b():
for i in range(10):
print(i,'b',os.getpid())
time.sleep(1)
if __name__ == '__main__':
start = time.time();
a_p = multiprocessing.Process(target=work_a)
#a_p.start()
b_p = multiprocessing.Process(target=work_b)
#b_p.start()
for p in (a_p,b_p):
p.start()
for p in (a_p,b_p):
p.join()
print('时间消耗:',time.time() - start) # 大概 10s
print('parent pid is %d' % os.getpid())
5.work_a() join() 阻塞,会影响 work_b()执行
#coding:utf-8
import time
import os
import multiprocessing
def work_a():
for i in range(10):
print(i,'a',os.getpid())
time.sleep(1)
def work_b():
for i in range(10):
print(i,'b',os.getpid())
time.sleep(1)
if __name__ == '__main__':
start = time.time();
a_p = multiprocessing.Process(target=work_a)
a_p.start()
a_p.join()
b_p = multiprocessing.Process(target=work_b)
b_p.start()
# for p in (a_p,b_p):
# p.start()
#
# for p in (a_p,b_p):
# p.join()
print('时间消耗:',time.time() - start) # 大概 10s
print('parent pid is %d' % os.getpid())
5. is_alive() 函数
#coding:utf-8
import time
import os
import multiprocessing
def work_a():
for i in range(10):
print(i,'a',os.getpid())
time.sleep(1)
def work_b():
for i in range(10):
print(i,'b',os.getpid())
time.sleep(1)
if __name__ == '__main__':
start = time.time();
a_p = multiprocessing.Process(target=work_a)
# a_p.start()
# a_p.join()
b_p = multiprocessing.Process(target=work_b)
# b_p.start()
for p in (a_p,b_p):
p.start()
for p in (a_p,b_p):
p.join()
for p in (a_p,b_p):
print('进程是否还活 : ',p.is_alive())
print('时间消耗:',time.time() - start) # 大概 10s
print('parent pid is %d' % os.getpid())
目前多进程存在的问题:
1.通过进程模块执行的函数无法获取返回值。
2.多个进程同时修改文件可能会出现错误。
3.进程数量太多可能会造成资源不足,甚至死机等情况。

浙公网安备 33010602011771号