與線程不同,進程沒有任何共享狀態,進程修改的數據,改動僅限於該進程內,多進程間的資源是相互獨立的,多進程是並行的
多進程的實現與多線程類似
注意:在windows中Process()必須放到# if __name__ == '__main__':下
import multiprocessing,time
def run():
time.sleep(1)
print('hello',time.ctime())
if __name__ == '__main__':
l=[]
for i in range(3):
t=multiprocessing.Process(target=run)
l.append(t)
t.start()
for t in l:
t.join()
print('end...')
'''
hello Fri Apr 20 22:08:32 2018
hello Fri Apr 20 22:08:32 2018
hello Fri Apr 20 22:08:32 2018
end...
'''
用類實現import multiprocessing,time
class Myprocess(multiprocessing.Process):
def run(self):
time.sleep(1)
print('hello',self.name,time.ctime())
if __name__ == '__main__':
l=[]
for i in range(3):
t=Myprocess()
l.append(t)
t.start()
for t in l:
t.join()
print('end...')
'''
hello Myprocess-1 Fri Apr 20 22:16:41 2018
hello Myprocess-2 Fri Apr 20 22:16:42 2018
hello Myprocess-3 Fri Apr 20 22:16:42 2018
end...
'''
進程間的數據是相互獨立的
import multiprocessing,time,os
n=100
def foo():
global n
n=0
print('subprocess n is',n)
if __name__ == '__main__':
t=multiprocessing.Process(target=foo)
t.start()
t.join()
print('main process n is',n)
'''
subprocess n is 0
main process n is 100
'''
守護進程
import multiprocessing,time
class Myprocess(multiprocessing.Process):
def run(self):
time.sleep(1)
print('hello',self.name,time.ctime())
if __name__ == '__main__':
l=[]
for i in range(3):
t=Myprocess()
l.append(t)
t.daemon=True
t.start()
print('end...')
'''
end...
'''
注意:進程之間是互相獨立的,主進程代碼運行結束,守護進程隨即終止
#主進程代碼運行完畢,守護進程就會結束
from multiprocessing import Process
from threading import Thread
import time
def foo():
print(123)
time.sleep(1)
print("end123")
def bar():
print(456)
time.sleep(3)
print("end456")
if __name__ == '__main__':
p1=Process(target=foo)
p2=Process(target=bar)
p1.daemon=True
p1.start()
p2.start()
print("main-------") #打印該行則主進程代碼結束,則守護進程p1應該被終止,可能會有p1任務執行的打印信息123,因爲主進程打印main----時,p1也執行了,但是隨即被終止
'''
main-------
456
end456
'''
PID
import multiprocessing,time,os
def info(title):
print('title:',title)
print('Parent process ID:',os.getppid())#打印父進程ID
print('Process ID:',os.getpid())#打印現在進程ID
def f():
info('main process')
print('Ok...')
if __name__ == '__main__':
f()
t=multiprocessing.Process(target=info,args=('subprocess',))
print('-'*20)
time.sleep(2)
t.start()
t.join()
print('end....')
'''
title: main process
Parent process ID: 4676 #因爲使用pycharm運行,故pycharm的進程ID爲父進程,如果用解釋器則沒有父進程ID
Process ID: 2980
Ok...
--------------------
title: subprocess
Parent process ID: 2980
Process ID: 2116
end....
'''