方式一
在windows系統(tǒng)上,開啟子進(jìn)程的操作必須放到:
if name == 'main':的子代碼中
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=('子進(jìn)程...',))
p.start()
print('主進(jìn)程...')
方式二
from multiprocessing import Process
import time
class MyProcess(Process):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print('%s is running...' % self.name)
time.sleep(3)
print('%s is done' % self.name)
if __name__ == '__main__':
p = MyProcess('子進(jìn)程...')
p.start()
print('主進(jìn)程...')
join方法
join:讓主進(jìn)程在原地等待,等待子進(jìn)程運行完畢,不會影響子進(jìn)程的執(zhí)行
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__':
"""
p1=Process(target=task,args=('子1',1))
p2=Process(target=task,args=('子2',2))
p3=Process(target=task,args=('子3',3))
start=time.time()
p1.start()
p2.start()
p3.start()
p3.join()
p1.join()
p2.join()
print('主',(time.time()-start))
"""
start=time.time()
p_l=[]
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()
print('主', (time.time() - start))
驗證:進(jìn)程之間內(nèi)存空間相互隔離
from multiprocessing import Process
n=100
def task():
global n
n=0
if __name__ == '__main__':
p=Process(target=task)
p.start()
p.join()
print(n)
打印 n 發(fā)現(xiàn) n 的值還是為100 ,說明子進(jìn)程內(nèi)的更改并不會影響到主進(jìn)程的內(nèi)存空間,也就是說明了進(jìn)程之間的內(nèi)存空間相互隔離
進(jìn)程對象其他相關(guān)的屬性或方法
1. 進(jìn)程pid:每一個進(jìn)程在操作系統(tǒng)內(nèi)都有一個唯一的id號,稱之為pid
from multiprocessing import Process,current_process
import time
def task():
print('%s is running' %current_process().pid)
time.sleep(30)
print('%s is done' %current_process().pid)
if __name__ == '__main__':
p=Process(target=task)
p.start()
print('主',current_process().pid)
上下兩種不同的寫法
from multiprocessing import Process,current_process
import time,os
def task():
print('%s is running 爹是:%s' %(os.getpid(),os.getppid()))
time.sleep(30)
print('%s is done 爹是:%s' %(os.getpid(),os.getppid()))
if __name__ == '__main__':
p=Process(target=task)
p.start()
print('主:%s 主他爹:%s' %(os.getpid(),os.getppid()))
2. 進(jìn)程對象其他相關(guān)的屬性或方法
from multiprocessing import Process,current_process
import time,os
def task():
print('%s is running 爹是:%s' %(os.getpid(),os.getppid()))
time.sleep(30)
print('%s is done 爹是:%s' %(os.getpid(),os.getppid()))
if __name__ == '__main__':
p=Process(target=task,name='子進(jìn)程1')
p.start()
# print(p.name)
p.terminate()
# time.sleep(0.1)
print(p.is_alive())
print('主:%s 主他爹:%s' %(os.getpid(),os.getppid()))