[b0022] python 归纳 (八)_多进程_基本使用

# -*- coding: UTF-8 -*-
"""
测试进程使用 multiprocessing.Process

使用:
    1. 准备一个函数<fun>,子进程要执行的代码放这里面
         def run_proc(name,l_list)
    2. 以函数名、tuple(函数参数1,函数参数2...),创建Process 对象
         p = multiprocessing.Process(target=run_proc, args=(str(i),l) )
    3. 启动子进程,这时主进程不会阻塞
         p.start()
    4. 想让主进程阻塞,等待子进程完成,接上执行
         p.join()

总结:
   1.python 多进程类似java的多线程
   2.case 1 说明 执行子进程时 import <module> 会在各个子进程中重新执行
             也就是,无法通过 模块.变量 实现进程间数据共享
   3.case2,case 3 执行子进程时,调用程序所在空间的变量,能在子进程函数中
     执行访问,但是修改值无法传递到外面
             也就是,无法通过 调用子进程所在文件的变量实现进程间数据共享
   4.case4 不能这样使用变量
   5.case5 从进程调用参数,传入可改变对象list,也无法实现进程间数据共享

a.进程间数据共享要靠其他方式

疑问:
进程对象.join() 实现主进程等待子进程结束
如何实现 子进程2 等待 子进程1 结束

"""
import os,time
from multiprocessing import  Process
import psutil
import test_m # 测试模块 里面只有变量 m=1

c = "c"

def run_proc(name,l_list):
    print "Child process %s (%s) is running ..." % (name,os.getpid(),)
    print "sub process %s" % psutil.Process(os.getpid()).name()
    print "list:",l_list
    l_list[0] = "a" + name

    # case  1
    print test_m.m
    time.sleep(5)
    print "%s end" % os.getpid()
    test_m.m = 2

    # case  2
    # global c 加上报错
    print c

    # case 3
    global d  # 不加报错
    print d
    d = 'dd'

    # case 4
    print e  # pycharm编辑器里不提示红色,运行时报错

d = "d"

if __name__ == '__main__':
    print  'main process %s.'  % os.getpid()
    print "main process %s" % psutil.Process(os.getpid()).name()

    e = "e"
    test_m.m = 3
    l = ["l1","l2"]

    for i in  range(2):
        p = Process(target=run_proc, args=(str(i),l) )
        print 'process will start,%s' % os.getpid()
        p.start()
        print 'flag1 %d' % i
        p.join() # 等待进程完成
        print 'flag2 %d' % i

        # case 5
        print 'list in main:',l

    print "main end %s."  % os.getpid()
    # case 1
    print test_m.m

"""
Out:
main process 7008.
main process python.exe
process will start,7008
flag1 0
Child process 0 (1272) is running ...
sub process python.exe
list: ['l1', 'l2']
1
1272 end
c
d
Process Process-1:
.....省略
NameError: global name 'e' is not defined
flag2 0
list in main: ['l1', 'l2']
process will start,7008
flag1 1
Child process 1 (3216) is running ...
sub process python.exe
list: ['l1', 'l2']
1
Process Process-2:
.....省略
NameError: global name 'e' is not defined
3216 end
c
d
flag2 1
list in main: ['l1', 'l2']
main end 7008.
3
"""

  

posted @ 2018-09-04 20:58  sunzebo  阅读(260)  评论(0编辑  收藏  举报