python的多進程(簡單的多進程,多進程通信,多進程通過文件通信,進程池)

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是用來執行參數代碼,然後再運行主進程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章