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.进程数量太多可能会造成资源不足,甚至死机等情况。

posted @ 2022-12-16 18:11  repinkply  阅读(28)  评论(0)    收藏  举报