1多進程:
像要了解多進程,首先就要先了解概念:程序、進程、線程。
#1個.py文件就可以叫:程序 是靜態概念
#進程: 一個分配資源的基本單位,是一個程序運行及分配到它手上的資源的統稱
#線程: 運行進程進行動作的基本單位
那麼我們來寫一個簡單的多進程:
import os
import multiprocessing
def work():
for i in range(5):
print('work1',i)
print('當前進程:',multiprocessing.current_process().pid) #獲取當前進程編號
print('父進程id:',os.getppid()) #ppid是父進程,pid是當前進程
if __name__ == '__main__':
process = multiprocessing.Process(target=work) #主進程裏創建子進程
process.start()
print('當前進程編號:',os.getpid())
2多進程之間的通信:
多進程之間,或者說進程之間,全局變量不共享,所以需要有一個第三方通道來傳遞參數,使進程間實現通信,也就是實現變量共享
#用消息隊列,來進行多進程之間通信
import multiprocessing
if __name__ == '__main__':
queue = multiprocessing.Queue(maxsize=3) #空間存三條
#向隊列裏面放入消息
queue.put('hello')
queue.put(1)
queue.put([1,2,3])
# queue.put({'a':1},timeout=1) #(要傳的參數,溢出時間)
print(queue)
print(queue.get())
print(queue.get())
print(queue.get())
print(queue.get(timeout=1)) #一共只存了三條消息,所以導出第四條是導不出的,但是搜索不到就一直卡在搜索那裏,所以設置一個溢出時間,超過時間的放棄執行此次搜索,返回錯誤
3多進程之間通過文件通信:
我們現在知道,進程之間是不共享全局變量的,我們要讓他共享,就得進程通信,那麼不用queue這個函數,我們還可以怎麼實現通信呢?沒錯,就是可以通過文件來通信。queue實質上也只是提供了一個類似保管平臺一樣的東西,使的變量通過這個平臺來傳遞參數,甲傳給乙,甲本來就知道變量是多少,乙收到,也知道了變量是多少,這樣一來,雙方都知道變量了,換個說法,也就是實現了雙方的信息共享,也就是通信了
# 通過文件來進行多進程間通信
import multiprocessing
def write(wenjan,data):
f = open(wenjan,'w')
# f.seek(0)
# f.truncate() # 清空文件
f.write(data)
f.close()
def read(wenjian):
g=open(wenjian,'r')
nei_rong = g.read()
# g.truncate()
g.close()
print('內容是:',nei_rong)
if __name__ == '__main__':
data = input('請輸入要傳遞數據:')
# queue = multiprocessing.Queue(maxsize=5)
wenjian = '123.text'
t1 = multiprocessing.Process(target=write,args=(wenjian,data))
t2 = multiprocessing.Process(target=read,args=(wenjian,))
t1.start()
t1.join()
t2.start()
4 進程池:
# 進程池是由多個子進程組成,使用程序創建子進程
def a(index):
print(index)
print(os.getpid()) #查看進程id
time.sleep(2)
import os
import time
import multiprocessing
if __name__ == '__main__':
pool = multiprocessing.Pool(3) #創建進程池(一次可以用三個子進程)
for i in range(10):
pool.apply_async(a,(5,)) #非阻塞方式調用(調用好會釋放池子裏的進程(進程id:x,進程id:y,進程id:z) , 進程(進程id:x,進程id:y,進程id:z)可以重新被利用)
pool.close() #關閉池子,不接受任務
pool.join() #池子操作完成後,join是用來執行參數代碼,然後再運行主進程