进程创建 033
一 . 創建進程的兩種方法 :?
1 第一種方法: 利用Process直接生成
p1 = Process(target = fun1,args=(1,))
p1.start()
from multiprocessing import Process import os def func1(n):time.sleep(1)print(n) def func2(n):time.sleep(1)print(n) def func3(n):time.sleep(1)print(n) def func4(n):time.sleep(1)print(n) if __name__ == '__main__':p1 = Process(target=func1, args=(1,)) # 創建一個新進程 第一種方式p2 = Process(target=func2, args=(2,))p3 = Process(target=func3, args=(3,))p4 = Process(target=func4, args=(4,))p1.start() # 給cpu發送指令 告訴cpu已準備就緒 等待被調用 p2.start()p3.start()p4.start()print('主程序結束') 進程創建的第一種方法2 第二種方法:自定義一個類 繼承 process 類
重寫run方法,傳參數的時候要寫init 但是要注意 在init方法中運用父類的init方法
Windows 下寫代碼開啟子進程時 必須寫上?if __name__ == '__main__':
from multiprocessing import Process class MyProcess(Process):def __init__(self,n,name):super().__init__()self.n = nself.name = namedef run(self): # 必須用run定義print('子進程的進程id',os.getpid())print('你看看',self.n) if __name__ == '__main__':p1 = MyProcess(100,name='子進程1')p1.start()print('p1.name', p1.name)print('p1.pid', p1.pid)print('主進程結束') 創建進程的第二種方法二 兩種參數形式
args= (1,)? ? ?kwargs = {'n':1} 必須和執行任務需要的形參相同 不然傳不進去
三 驗證進程之間是空間隔離
# 定義全局變量 global_num = 100 def func1():global global_num #引入全局變量global_num = 0 # 將全局變量改為0print('子進程全局變量', global_num) if __name__ == "__main__":p1 = Process(target=func1,)p1.start()time.sleep(1)print('主進程的全局變量', global_num) # 運行結果如下: # 子進程全局變量 0 # 主進程的全局變量 100子進程的結果表明將全局變量修改為0 但主進程結果仍是100 證明進程之間是相互隔離的 不共享資源
四 join 方法 讓主進程 加上join的地方等待 (即阻塞) 等待子進程執行完之后,再繼續往下執行 我的主進程 好多時候 , 我們主進程需要子進程的執行結果 所以必須要等待.join感覺就像是將子進程和主進程拼接起來一樣 將異步改為同步進行?
from multiprocessing import Process def fun1(n):time.sleep(1)print(n) if __name__ == '__main__':pro_list = []for i in range(10):p1 = Process(target=fun1,args=(i,))p1.start()pro_list.append(p1)for p in pro_list:p.join()print('主進程結束') # 結果就是10個子進程結束之后才會結束主進程 或者 from multiprocessing import Process # 驗證join方法 global_num = 100 def func1():global global_num #引入全局變量global_num = 0print('子進程全局變量', global_num) if __name__ == "__main__":p1 = Process(target=func1,)p1.start()p1.join() # 阻塞住 等待p1子進程執行結束 主進程程序才能從這里繼續往下執行print('主進程的全局變量', global_num) 驗證join 方法五 驗證并發的執行時間?
六 for 循環在多進程中的應用?
七 關閉進程但是它只是給操作系統發個關閉進程的信號 實際操作是操作系統關閉的
僵尸進程和孤兒進程(了解)
import time import os from multiprocessing import Process def func1():time.sleep(10)print(os.getpid())print('子進程') if __name__ == '__main__':p1 = Process(target=func1,)p1.start()print('主進程的ID',os.getpid())print('主進程結束')守護進程 (應用開啟qq)
import time import os from multiprocessing import Process def func1():time.sleep(5)print(os.getpid())print('子進程') if __name__ == '__main__':p1 = Process(target=func1,)# 將p1子進程設置為守護進程p1.daemon = True # 如果設為True 代表p為后臺運行的守護進程, 當p的父類進程終止時,p也隨之終止,并且設定為True后,p不能創建自己的#新進程 , 必須在p.start()之前設置 也不能再創建子進程 p1.start()print('主進程結束')
?十一 子進程不能input
轉載于:https://www.cnblogs.com/f-g-f/p/9839777.html
總結
- 上一篇: 全端开发——html简介与常用标签
- 下一篇: JPA实体关联关系,一对一以及转换器