一、開啟進程的兩種方式
方式一:
from multiprocessing import Process
import time
def task(x):
print('%s is running' %x)
time.sleep(3)
print('%s is done' %x)
if __name__ == '__main__':
# Process(target=task,kwargs={'x':'子進程'})
p=Process(target=task,args=('子進程',)) # 如果args=(),括號內只有一個參數,一定記住加逗號
p.start() # 只是在操作系統發送一個開啟子進程的信號
print('主')
方式二:
from multiprocessing import Process
import time
class Myprocess(Process):
def run(self):
print('%s is running'%self.name) # name是從父類(Process)繼承來的
time.sleep(3)
print('%s is done'%self.name)
if __name__ == '__main__':
p=Myprocess()
p.start() #p.run()
print('主')
方式二(自定義name)
from multiprocessing import Process
import time
class Myprocess(Process):
def __init__(self,x):
super().__init__()
self.name=x
def run(self):
print('%s is running' %self.name)
time.sleep(3)
print('%s is done' %self.name)
if __name__ == '__main__':
p=Myprocess('子進程1')
p.start() #p.run()
print('主')
主要使用方式一,可以開啟多個task
二、進程內存空間彼此隔離
from multiprocessing import Process
import time
x=100
def task():
global x
x=0
print('done')
if __name__ == '__main__':
p=Process(target=task)
p.start()
time.sleep(500) # 讓父進程在原地等待,等了500s后,才執行下一行代碼
print(x)
三、進程對象的方法或屬性
1、join :主線程等待p終止(強調:是主線程處於等的狀態,而p是處於運行的狀態)
p.join只能join住start開啟的進程,而不能join住run開啟的進程 (即task)
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,args=('子進程',))
p.start()
p.join() # 讓父進程在原地等待,等到子進程運行完畢后,才執行下一行代碼
print('主')
同時開多個進程:
from multiprocessing import Process
import time
def task(name,n):
print('%s is running'%name)
time.sleep(n)
print('%s is done'%name)
if __name__ == '__main__':
p_l=[]
start_time=time.time()
for i in range(1,4):
p=Process(target=task,args=('子進程%s'%i,i))
p_l.append(p)
p.start()
for p in p_l:
p.join()
stop_time=time.time()
print('主',(stop_time-start_time))
2、pid 和 ppid
from multiprocessing import Process
import time
import os
def task():
print('自己的id:%s 父進程的id:%s ' %(os.getpid(),os.getppid()))
time.sleep(200)
if __name__ == '__main__':
p1=Process(target=task)
p1.start()
print('主',os.getpid(),os.getppid())
# 爹--》主--》兒子
了解:
from multiprocessing import Process,current_process
import time
def task():
print('子進程[%s]運行。。。。' %current_process().name)
time.sleep(200)
if __name__ == '__main__':
p1=Process(target=task,name='子進程1')
p1.start()
# print(p1.name)
print('主')
from multiprocessing import Process,current_process
import time
def task():
print('子進程[%s]運行。。。。' %current_process().name)
time.sleep(2)
if __name__ == '__main__':
p1=Process(target=task,name='子進程1')
p1.start()
# print(p1.is_alive())
# p1.join()
# print(p1.is_alive()) #p.is_alive():如果p仍然運行,返回True
p1.terminate()
time.sleep(1)
print(p1.is_alive())
print('主')