python系统编程篇之进程
进程与程序的概念问题
编写完毕的代码,在没有运行的时候,称为程序
正在运行的代码,是进程
进程,不只是正在运行的代码,还有需要的运行环境
区分程序与进程,这两个概念是很重要的
fork
运用fork(),可以创建子进程。但是需要注意的是,fork()只能在mac,linux,UNIX系统上使用,而在windows中是不能使用的
import os
rpid = os.fork()
if rpid == 0:
print('1')
else:
print('2')
运行结果:
可以是1先被打印出来,也可以是2被先打印出来,
这是取决于cpu的进程调度
getpid(),getppid()
import os
rpid = os.fork()
if rpid<0:
print("fork调用失败。")
elif rpid == 0:
print("我是子进程(%s),我的父进程是(%s)"%(os.getpid(),os.getppid()))
x+=1
else:
print("我是父进程(%s),我的子进程是(%s)"%(os.getpid(),rpid))
print("父子进程都可以执行这里的代码")
运行结果:
我是父进程(19360),我的子进程是(19361)
父子进程都可以执行这里的代码
我是子进程(19361),我的父进程是(19360)
父子进程都可以执行这里的代码
multprocessing
如果你打算编写多进程的服务程序,Unix/Linux无疑是正确的选择。由于Windows没有fork调用,难道在Windows上无法用Python编写多进程的程序?
由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。multiprocessing模块就是跨平台版本的多进程模块。
#coding=utf-8
from multiprocessing import Process
import os
# 子进程要执行的代码
def run_proc(name):
print('子进程运行中,name= %s ,pid=%d...' % (name, os.getpid()))
if __name__=='__main__':
print('父进程 %d.' % os.getpid())
p = Process(target=run_proc, args=('test',))
print('子进程将要执行')
p.start()
p.join()
print('子进程已结束')
多进程能否修改全局变量
import multiprocessing
mylist = list()
def work1():
mylist.append(1)
print("子进程1中的列表为", mylist)
def work2():
mylist.append(2)
print("子进程2中的列表为", mylist)
if __name__ == '__main__':
p1 = multiprocessing.Process(target=work1)
p2 = multiprocessing.Process(target=work2)
p1.start()
p1.join()
p2.start()
p2.join()
print('主进程的列表为', mylist)
运行结果:
多进程中,每个进程中所有数据(包括全局变量)都各有拥有一份,互不影响