多進程

與線程不同,進程沒有任何共享狀態,進程修改的數據,改動僅限於該進程內,多進程間的資源是相互獨立的,多進程是並行的

多進程的實現與多線程類似

注意:在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....
'''

發佈了51 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章