在Python中,如果我们希望并发的执行一些任务,最简单的办法是使用os下面的fork()方法,例如
import os
print("OSFork")
contentStr = 'hello'
pid = os.fork()
if pid == 0:
contentStr = contentStr + ' child'
print(contentStr)
else:
contentStr = contentStr + ' parent'
print(contentStr)
print("over")
运行一下,打印结果如下
dengyuguodeMacBook-Air:python dengyuguo$ /usr/bin/python3 /Users/dengyuguo/Desktop/python/OSFork.py
OSFork
hello parent
over
hello child
over
第一次看到这种写法跟运行结果可能会感觉比较奇怪。实际上这里Python是借鉴了linux系统对多线程的实现,准确点说是多进程。
linux系统中,fork()方法会产生一个新的进程,并且和当前进程一起返回,差别是当前进程中会返回创建的子进程的pid,而子进程中返回的pid是0。后续的逻辑在两个进程中都会执行,我们能够通过返回的pid是否为0来判断代码是跑在子进程,还是当前进程。
数据问题,fork()函数执行后,子进程会共享父进程的内存空间,但是这个内存空间被标记为“写时复制”。所谓写时复制,指的是两个任务可以同时自由的读取内存,但任意一个任务试图对内存进行修改时,内存就会复制一份提供给修改方单独使用,以免影响到其他的任务使用。
理解了背后的设计逻辑,再看上面的代码,就感觉很清晰了。