<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文用Python範例闡述了一些關於程序、執行緒和協程的概念,由於水平有限,難免出現錯漏,敬請批評改正。
熟悉Python基本語法熟悉Python操作程序、執行緒、協程的相關庫
Python是一種跨平臺的計算機程式設計語言。是一個高層次的結合瞭解釋性、編譯性、互動性和物件導向的指令碼語言。最初被設計用於編寫自動化指令碼(shell),隨著版本的不斷更新和語言新功能的新增,越多被用於獨立的、大型專案的開發。
例如,
程序:程式執行在作業系統上的一個範例,就稱之為程序。程序需要相應的系統資源:記憶體、時間片、pid(程序號)。 一個執行的程式(程式碼)就是一個程序,沒有執行的程式碼叫程式,程序是系統資源分配的最小單位,程序擁有自己獨立的記憶體空間,所以程序間資料不共用,開銷大。
建立程序步驟:
1.首先要匯入 multiprocessing 中的 Process;
2.建立一個 Process 物件;
3.建立 Process 物件時,可以傳遞引數;
4.使用 start()啟動程序;
5.結束程序。
import os from multiprocessing import Process import time def pro_func(name,age,**kwargs): print("程序正在執行,name=%s, age=%d, pid=%d" %(name, age, os.getpid())) print('kwargs引數值',kwargs) time.sleep(0.1) if __name__=="__main__": p=Process(target=pro_func,args=('Friendship',18),kwargs={'愛好':'Python'}) print('啟動程序') p.start() print('程是否還在活著:',p.is_alive())# 判斷程序程序是否還在活著 time.sleep(0.5) # 1 秒鐘之後,立刻結束程序 print('結束程序') p.terminate() # 不管任務是否完成,立即終止程序 p.join() # 等待子程序執行結束 print('程是否還在活著:',p.is_alive())# 判斷程序程序是否還在活著
注意:程序間不共用全域性變數。
以一個讀寫程式為例,main函數為一個主程序,write函數為一個子程序,read函數為另一個子程序,然後兩個子程序進行讀寫操作。
import os import time import random from multiprocessing import Process,Queue # 寫資料函數 def write(q): for value in ['I','love','Python']: print('在佇列裡寫入 %s ' % value) q.put(value) time.sleep(random.random()) # 讀資料函數 def read(q): while True: if not q.empty(): value = q.get(True) print('從佇列中讀取 %s ' % value) time.sleep(random.random()) else: break if __name__=="__main__": # 主程序 # 主程序建立 Queue,並傳給各個子程序 q=Queue() # 建立兩個程序 pw=Process(target=write,args=(q,)) pr=Process(target=read,args=(q,)) # 啟動子程序 pw pw.start() # 等待 pw結束 pw.join() # 啟動子程序 pr pr.start() # 等待 pw結束 pr.join() print('End!')
from multiprocessing import Manager,Pool import os,time,random def read(q): print("read程序 啟動(%s),主程序為(%s)" % (os.getpid(), os.getppid())) for i in range(q.qsize()): print("read程序 從 Queue 獲取到訊息:%s" % q.get(True)) def write(q): print("write程序 啟動(%s),主程序為(%s)" % (os.getpid(), os.getppid())) for i in "Python": q.put(i) if __name__=="__main__": print("主程序(%s) start" % os.getpid()) q = Manager().Queue() # 使用 Manager 中的 Queue # 定義一個程序池 po = Pool() # Pool().apply_async(要呼叫的目標,(傳遞給目標的引數元祖,)) po.apply_async(write, (q,)) time.sleep(1) # 先讓上面的任務向 Queue 存入資料,然後再讓下面的任務開始從中取資料 po.apply_async(read, (q,)) po.close() # 關閉程序池,關閉後 po 不再接收新的請求 po.join() # 等待 po 中所有子程序執行完成,必須放在 close 語句之後 print("(%s) End!" % os.getpid())
執行緒:排程執行的最小單位,也叫執行路徑,不能獨立存在,依賴程序存在一個程序至少有一個執行緒,叫主執行緒,而多個執行緒共用記憶體(資料共用,共用全域性變數),從而極大地提高了程式的執行效率。
上圖,紅框表示程序號(PID)為1624的程序,有118個執行緒。
import _thread import time import random # 為執行緒定義一個函數 def print_time(threadName): count = 0 while count < 5: time.sleep(random.random()) count += 1 print ("%s: %s" % (threadName, time.ctime(time.time()))) # 建立兩個執行緒 try: _thread.start_new_thread(print_time, ("Thread-1",)) _thread.start_new_thread(print_time, ("Thread-2",)) except: print ("Error: 無法啟動執行緒") while True: pass
# 使用 threading 模組建立執行緒 import threading import time import random class myThread(threading.Thread): def __init__(self, threadID, name): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.delay = random.random() def run(self): print ("開始執行緒:" + self.name) print_time(self.name, 5) print ("退出執行緒:" + self.name) def print_time(threadName, count): while count: time.sleep(random.random()) print ("%s: %s" % (threadName, time.ctime(time.time()))) count -= 1 # 建立兩個執行緒 thread1 = myThread(1, "Thread-1") thread2 = myThread(2, "Thread-2") # 開啟新執行緒 thread1.start() thread2.start() thread1.join() thread2.join() print ("退出主執行緒")
import asyncio import time import random async def work(msg): print("收到的資訊:'{}'".format(msg)) print("{}1{}".format("*"*10,"*"*10)) # 為了方便,展示結果 await asyncio.sleep(random.random()) print("{}2{}".format("*"*10,"*"*10)) # 為了方便,展示結果 print(msg) async def main(): # 建立兩個任務物件(協程),並加入到事件迴圈中 Coroutines1 = asyncio.create_task(work("hello")) Coroutines2 = asyncio.create_task(work("Python")) print("開始時間: {}".format(time.asctime(time.localtime(time.time())))) await Coroutines1 # 此時並行執行Coroutines1和Coroutines2 print("{}3{}".format("*"*10,"*"*10)) # 為了方便,展示結果 await Coroutines2 # await相當於掛起當前任務,去執行其他任務,此時是堵塞的 print("{}4{}".format("*"*10,"*"*10)) # 為了方便,展示結果 print("結束時間:{}".format(time.asctime(time.localtime(time.time())))) asyncio.run(main())# asyncio.run(main())建立一個事件迴圈,並以main為主要程式入口
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45