# -*- 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 """