python中的进程
生活随笔
收集整理的這篇文章主要介紹了
python中的进程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
閱讀目錄
進程:顧名思義,運行中的程序
一、創建進程的方式:(2種)
兩種方式都是利用multiprocessing模塊導入Process類來實現具體方法看代碼
第一種:
from multiprocessing import Process import time# 創建的子程序代碼 def task(name):print('%s is running' % name)time.sleep(2)print('%s is over' % name)# 注意,在windows系統中,創建進程會將代碼以模塊的方式從頭到尾加載一遍 # 一定要寫在if __name__ == '__main__':代碼塊里面 # 強調:函數名一旦加括號,執行優先級最高,立刻執行 # 主程序 if __name__ == '__main__':p1 = Process(target=task, args=('egon', ))p1.start() # 告訴操作系統創建一個進程print('主程序打印打印')第二種:
from multiprocessing import Process import timeclass MyProcess(Process):def __init__(self, name):super().__init__()self.name = name# 必須寫run方法def run(self):print('%s is running' % self.name)time.sleep(1)print('%s is end' % self.name)if __name__ == '__main__':obj = MyProcess('egon')obj.start()print('主程序')兩種方法其實過程大致相同,實現方式略微有點差別
結果都是:
主進程正在運行
egon is running!
egon is end!
子進程對象.start()方法:向操作系統發出請求:說我要創建個子進程了,快幫我搞一個。
此時start處的代碼相當于異步繼續向下執行,執行速度肯定會快于操作系統收到請求然后選擇性的創建子進程,所以主程序執行完了,子進程的代碼才開始執行。
要想讓子進程先執行,然后執行下面的主程序的話,可以在子進程下面來個.join(),意思是你子進程先走,我等你搞定了我再進行接下來的主進程代碼!
from multiprocessing import Process import timedef task(name):print('%s is running!' % name)time.sleep(2)print('%s is end!' %name)if __name__ == '__main__':p = Process(target=task, args=('egon', ))p.start()p.join()print('主進程繼續運行')# 結果 egon is running! egon is end! 主進程正在運行一次性創建多個子程序:
from multiprocessing import Process import timedef task(name):print('%s正在運行。。。。。' %name)time.sleep(2)print('%s運行結束。。。。。' %name)if __name__ == '__main__':p_list = []for i in range(1,4):p = Process(target=task, args=('進程[%s]' % i, ))p.start()p_list.append(p)for n in p_list:n.join()print('主進程繼續進行!')二、進程之間的數據是互相隔離的,無法共享
# 記住 進程與進程之間數據是隔離的!!! from multiprocessing import Processx = 100def task():global xx = 1if __name__ == '__main__':p = Process(target=task)p.start()p.join()print('主',x)三、進程之間的數據通信:
進程之間無法交互數據,因為進程與進程之間是相互隔離的,如果要實現數據的通信,可以間接的通過一些方法去實現:比如隊列
隊列相當于給進程間創造了一個公共管道,數據的通信通過這個管道進行。
from multiprocessing import Process,JoinableQueue import time import randomdef producer(name, food, q):for i in range(1,5):data = '%s<%s>' % (food, i)time.sleep(random.randint(1, 2))q.put(data)print('[%s]造好了[%s]' % (name, data))def consumer(name, q):while True:data = q.get()time.sleep(random.randint(1, 2))# if data is None: breakprint('[%s]吃了%s' % (name, data))q.task_done()if __name__ == '__main__':q = JoinableQueue()p1 = Process(target=producer, args=('大佬', '酸奶', q))p2 = Process(target=producer, args=('DSB', '香蕉', q))c2 = Process(target=consumer, args=('SSSS', q))c1 = Process(target=consumer, args=('BBBB', q))p1.start()p2.start()c1.daemon = Truec2.daemon = Truec1.start()c2.start()p1.join()p2.join()q.join()print('主程序-到此一游')四、生產者消費者模型
這個模型實際上就是隊列的應用,主要用于進程間的數據交互。一個產生數據一個拿產生的數據,實現過程就是隊列。
from multiprocessing import Process,JoinableQueue import time import randomdef producer(name, food, q):for i in range(1, 5):data = '%s%s' % (food, i)time.sleep(random.randint(1, 2))print('%s已經做好了%s' % (name, data))q.put(data)def consumer(name, q):while True:data = q.get()time.sleep(random.randint(1, 2))print('%s 消滅了一個%s' % (name, data))q.task_done() # 每次取完數據之后,都會告訴隊列一聲:我這次取完了if __name__ == '__main__':q = JoinableQueue() # 生成一個隊列對象p1 = Process(target=producer, args=('小明', '包子', q))p2 = Process(target=producer, args=('小黃', '饅頭', q))c1 = Process(target=consumer, args=('根根', q))c2 = Process(target=consumer, args=('矮矮', q))p1.start()p2.start()c1.daemon = True # 守護進程,達到主進程結束,這個子進程也會一起結束c2.daemon = True # 守護進程,達到主進程結束,這個子進程也會一起結束c1.start()c2.start()p1.join() # 生產者完成所有生成之后才能進行下一步p2.join()q.join() # 等待隊列中的數據全部取出,才能往下走print('主') 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的python中的进程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中基于tcp协议的通信(数据
- 下一篇: python中的线程