5.1.2 网络编程进阶---开启子进程的两种方式,进程之间内存空间是相互隔离的

当主进程开启子进程后,主进程会与子进程并行执行。当主进程执行后不会立马结束进程,而是会等子进程结束才结束,好去清理僵尸子进程(给子进程收尸)。

进程之间内存是相互隔离的。当创建子进程时,会把父进程的内存空间拷贝一份到子进程,子进程的改变不会影响主进程的内存空间。

但进程之间的IO是共享的,可以同时操作同一个文件或终端。

第一种方式:

from multiprocessing import Process
import time


def task(name):
print('%s is running' % name)
time.sleep(3)
print('%s is done' % name)


if __name__ == '__main__':
p = Process(target=task, kwargs={'name': '子进程1'})
# p = Process(target=task, args=('子进程1',))
p.start() # 仅仅只是给操作系统发送了一个信号,然后继续往下执行,不会等待子进程执行完成。但是会等子进程结束后,能结束主进程。

print('主')

#会执行子进程执行结束后,才结束自己进程。

# 输出结果:
# 主
# 子进程1 is running
# 子进程1 is done


第二种方式: 继承的方式
from multiprocessing import Process
import time


class MyProcess(Process): # 继承Process类
def __init__(self, name):
super().__init__()
self.name = name

def run(self): # 必须重写run方法
print('subprocess starting %s' % self.name)
time.sleep(3)
print('end subprocess %s' % self.name)


if __name__ == '__main__':
p = MyProcess('xxx')
p.start() # start自动绑定到run方法
print('主线程')

# 输出结果:
# 主线程
# subprocess starting xxx
# end subprocess xxx

进程之间,内存空间是相互隔离的:
from multiprocessing import Process

n = 100  # 在windows系统中应该把全局变量定义在if __name__ == '__main__'之上就可以了


def work():
    global n
    n = 0
    print('子进程内: ', n)


if __name__ == '__main__':
    p = Process(target=work)
    p.start()
    p.join()
    print('主进程内: ', n)

 输出:

子进程内: 0
主进程内: 100

posted @ 2018-06-16 09:20  beallaliu  阅读(291)  评论(0编辑  收藏  举报