上一篇:进程和线程的区别 | 手把手教你入门Python之一百零五
下一篇:进程间通信 | 手把手教你入门Python之一百零七
本文来自于千锋教育在阿里云开发者社区学习中心上线课程《Python入门2020最新大课》,主讲人姜伟。
多进程不能共享全局变量
import os, multiprocessing, threading
n = 100
def test():
global n
n += 1
print('test==={}里n的值是{}'.format(os.getpid(), hex(id(n))))
def demo():
global n
n += 1
print('demo===={}里n的值是{}'.format(os.getpid(), hex(id(n))))
print(threading.current_thread().name)
test() # 101
demo() # 102
# 同一个主进程里的两个子线程。线程之间可以共享同一进程的全局变量
# t1 = threading.Thread(target=test)
# t2 = threading.Thread(target=demo)
# t1.start()
# t2.start()
# if __name__ == '__main__':
# 不同进程各自保存一份全局变量,不会共享全局变量
# p1 = multiprocessing.Process(target=test)
# p2 = multiprocessing.Process(target=demo)
# p1.start() # 101
# p2.start() # 101
示例:
from multiprocessing import Process
import os
nums = [11, 22]
def work1():
"""子进程要执行的代码"""
print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))
for i in range(3):
nums.append(i)
print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))
def work2():
"""子进程要执行的代码"""
nums.pop()
print("in process2 pid=%d ,nums=%s" % (os.getpid(), nums))
if __name__ == '__main__':
p1 = Process(target=work1)
p1.start()
p1.join()
p2 = Process(target=work2)
p2.start()
print('in process0 pid={} ,nums={}'.format(os.getpid(),nums))
运行结果:
in process1 pid=2707 ,nums=[11, 22]
in process1 pid=2707 ,nums=[11, 22, 0]
in process1 pid=2707 ,nums=[11, 22, 0, 1]
in process1 pid=2707 ,nums=[11, 22, 0, 1, 2]
in process0 pid=2706 ,nums=[11, 22]
in process2 pid=2708 ,nums=[11]