溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python實現(xiàn)通過隊列完成進程間的多任務功能示例

發(fā)布時間:2020-09-11 22:34:29 來源:腳本之家 閱讀:238 作者:獨聽鐘聲晚 欄目:開發(fā)技術

本文實例講述了python實現(xiàn)通過隊列完成進程間的多任務功能。分享給大家供大家參考,具體如下:

1.通過隊列完成進程間的多任務

import multiprocessing


def download_data(q):
  """下載數(shù)據(jù)"""
  # 模擬從網(wǎng)上下載數(shù)據(jù)
  data = [11, 22, 33, 44]

  # 向隊列中寫入數(shù)據(jù)
  for temp in data:
    q.put(temp)
  print("----數(shù)據(jù)下載完成并且已存入隊列----")


def analysis_data(q):
  """數(shù)據(jù)處理"""
  waitting_analysis_data = list()
  # 從隊列中獲取數(shù)據(jù)
  while True:
    data = q.get()
    waitting_analysis_data.append(data)
    if q.empty():
      break
  print(waitting_analysis_data)


def main():
  # 1.創(chuàng)建一個隊列
  q = multiprocessing.Queue()
  q1 = multiprocessing.Process(target=download_data, args=(q,))
  q2 = multiprocessing.Process(target=analysis_data, args=(q,))
  q1.start()
  q2.start()


if __name__ == '__main__':
  main()

python實現(xiàn)通過隊列完成進程間的多任務功能示例

2.進程池pool

在程序?qū)嶋H處理問題過程中,忙時會有成千上萬的任務需要被執(zhí)行,閑時可能只有零星任務。那么在成千上萬個任務需要被執(zhí)行的時候,我們就需要去創(chuàng)建成千上萬個進程么?首先,創(chuàng)建進程需要消耗時間,銷毀進程也需要消耗時間。第二即便開啟了成千上萬的進程,操作系統(tǒng)也不能讓他們同時執(zhí)行,這樣反而會影響程序的效率。因此我們不能無限制的根據(jù)任務開啟或者結束進程。那么我們要怎么做呢?

在這里,要給大家介紹一個進程池的概念,定義一個池子,在里面放上固定數(shù)量的進程,有需求來了,就拿一個池中的進程來處理任務,等到處理完畢,進程并不關閉,而是將進程再放回進程池中繼續(xù)等待任務。如果有很多任務需要執(zhí)行,池中的進程數(shù)量不夠,任務就要等待之前的進程執(zhí)行任務完畢歸來,拿到空閑進程才能繼續(xù)執(zhí)行。也就是說,池中進程的數(shù)量是固定的,那么同一時間最多有固定數(shù)量的進程在運行。這樣不會增加操作系統(tǒng)的調(diào)度難度,還節(jié)省了開閉進程的時間,也一定程度上能夠?qū)崿F(xiàn)并發(fā)效果。

案例:
from multiprocessing import Pool
import os, time, random


def worker(msg):
  t_start = time.time()
  print("進程%s開始執(zhí)行,進程號為%d" % (msg, os.getpid()))
  # random.random()隨機生成0-1之間的浮點數(shù)
  time.sleep(random.random()*2)
  t_stop = time.time()
  print("進程",msg,"執(zhí)行完成,耗時%0.2f" % (t_stop-t_start))


def main():
  # 定義一個進程池,最大進程數(shù)為3
  po = Pool(3)
  for i in range(10):
    # Pool().apply_async(要調(diào)用的目標,(傳遞給目標的參數(shù)元組,))
    # 每次循環(huán)將會用空閑出來的子進程去調(diào)用目標
    po.apply_async(worker,(i,))

  print("----start----")
  # 關閉進程池,關閉后po不再接受新的請求
  po.close()
# 等待po中所有子進程執(zhí)行完成,必須放在close語句之后
  po.join()

  print("----end----")


if __name__ == '__main__':
  main()

python實現(xiàn)通過隊列完成進程間的多任務功能示例

更多關于Python相關內(nèi)容感興趣的讀者可查看本站專題:《Python進程與線程操作技巧總結》、《Python數(shù)據(jù)結構與算法教程》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》、《Python+MySQL數(shù)據(jù)庫程序設計入門教程》及《Python常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對大家Python程序設計有所幫助。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI