第13次预习课-20180919 多进程编程
多進(jìn)程編程
?
進(jìn)程和線程之間的區(qū)別
Linux查看:
1)進(jìn)程: ps –ef
2)跟python相關(guān)的進(jìn)程 ps –ef|grep python
[root@iZ2zejbxp2btn9jh8knipuZ?~]#?ps?-ef|grep?python
root??????7717??7665??0?21:05?pts/0????00:00:00?grep?python
root?????16527?????1??0?Aug16??????????04:01:07?python?run.py
Windows:
啟動(dòng)任務(wù)管理器-進(jìn)程
?
?
程序不是進(jìn)程,當(dāng)程序處于運(yùn)行狀態(tài),才是進(jìn)程
https://www.cnblogs.com/ChunJian-YANG/p/5506209.html
?
同步和異步:
順序執(zhí)行:同步
不需要按照順序執(zhí)行:異步。異步執(zhí)行快,可以解決效率的問(wèn)題
?
什么時(shí)候用同步?什么時(shí)候用異步?
有依賴關(guān)系的時(shí)候只能用同步,沒(méi)有依賴關(guān)系的時(shí)候,可同步,可異步。(不需要前面步驟的處理結(jié)果)
?
進(jìn)程:
程序塊、數(shù)據(jù)塊、進(jìn)程控制塊三部分組成
?
進(jìn)程有3個(gè)狀態(tài):
就緒態(tài),運(yùn)行臺(tái),等待態(tài)
?
?
cpu是如何工作的?1臺(tái)機(jī)器1個(gè)cpu,1核,運(yùn)行10個(gè)進(jìn)程
按照時(shí)間片執(zhí)行,不停的上下文切換
?
內(nèi)存,硬盤
內(nèi)存比硬盤快 10-15倍左右,內(nèi)存的空間比較寶貴
掉電之后,內(nèi)存的數(shù)據(jù)不保留,硬盤會(huì)保留
?
內(nèi)存不夠的時(shí)候,windows 使用虛擬內(nèi)存,linux使用交換分區(qū)swap,將內(nèi)存的數(shù)據(jù)存在磁盤中,從磁盤中取回。
?
進(jìn)程至少有一個(gè)線程,線程依存于進(jìn)程內(nèi)部;
一個(gè)進(jìn)程如果有多個(gè)線程,所有的線程會(huì)共用這個(gè)進(jìn)程的資源和數(shù)據(jù)。
?
進(jìn)程間如何共享數(shù)據(jù)?
1)設(shè)置全局共享變量;
2)建立通信;
3)數(shù)據(jù)寫(xiě)入一個(gè)文件中。
?
進(jìn)程是操作系統(tǒng)分配資源的基本單位
?
Python使用多進(jìn)程實(shí)現(xiàn)更好的并發(fā)。
性能測(cè)試:模擬多個(gè)進(jìn)程或者線程,發(fā)送大量的請(qǐng)求給服務(wù)器端。
?
Python實(shí)現(xiàn)并發(fā)的方式:
多進(jìn)程:用到多核CPU
多線程: 只能用單核CPU,GIL全局解釋器鎖。并發(fā)請(qǐng)求有多IO的時(shí)候。
協(xié)程:單線程,發(fā)現(xiàn)IO等待的時(shí)候會(huì)跳過(guò)去。不用鎖。
?
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Linux?下通過(guò)fork生成進(jìn)程
"""
pid=os.fork()
????1.只用在Unix系統(tǒng)中有效,Windows系統(tǒng)中無(wú)效
????2.fork函數(shù)調(diào)用一次,返回兩次:
????在父進(jìn)程中返回值為子進(jìn)程id,在子進(jìn)程中返回值為0
"""
?
import?os
?
pid=os.fork() #生成一個(gè)子進(jìn)程,出現(xiàn)了2個(gè)進(jìn)程同時(shí)開(kāi)始向下執(zhí)行
?
if?pid==0:
????print("執(zhí)行子進(jìn)程,子進(jìn)程pid={pid},父進(jìn)程ppid={ppid}".\
format(pid=os.getpid(),ppid=os.getppid()))
else:
????print("執(zhí)行父進(jìn)程,子進(jìn)程pid={pid},父進(jìn)程ppid={ppid}".\
format(pid=pid,ppid=os.getpid()))
-------------------------------------------------------------------------------------------------------------------------------------------------------
理解:
os.fork()?執(zhí)行的時(shí)候會(huì)生成子進(jìn)程,主程序還有一個(gè)主進(jìn)程,此時(shí)出了2個(gè)進(jìn)程,一個(gè)主進(jìn)程,一個(gè)是子進(jìn)程
os.fork()規(guī)定,主進(jìn)程自動(dòng)獲取函數(shù)返回值是子進(jìn)程的pid,子進(jìn)程獲取函數(shù)返回值是0
主進(jìn)程:pid=19293
else:
print("執(zhí)行父進(jìn)程,子進(jìn)程pid={pid},父進(jìn)程ppid={ppid}".\
format(pid=pid,ppid=os.getpid()))
子進(jìn)程:pid?=?0
if?pid==0:
????print("執(zhí)行子進(jìn)程,子進(jìn)程pid={pid},父進(jìn)程ppid={ppid}".\
format(pid=os.getpid(),ppid=os.getppid()))
綜合起來(lái)看,因?yàn)?個(gè)進(jìn)程分別執(zhí)行if和else的代碼塊,所以最后的結(jié)果是,if被子進(jìn)程執(zhí)行了一次,else被主進(jìn)程執(zhí)行了一次
-------------------------------------------------------------------------------------------------------------------------------------------------------
"""
Process常用屬性與方法:
????name:進(jìn)程名
????pid:進(jìn)程id
????run(),自定義子類時(shí)覆寫(xiě)
????start(),開(kāi)啟進(jìn)程
????join(timeout=None),阻塞進(jìn)程
????terminate(),終止進(jìn)程
????is_alive(),判斷進(jìn)程是否存活
"""
?
import?os,time
from?multiprocessing?import?Process
?
def?worker():
????print("子進(jìn)程執(zhí)行中>>>?pid={0},ppid={1}".format(os.getpid(),os.getppid()))
????time.sleep(2)
????print("子進(jìn)程終止>>>?pid={0}".format(os.getpid()))
?
def?main():
????print("主進(jìn)程執(zhí)行中>>>?pid={0}".format(os.getpid()))
?
????ps=[]
????#?創(chuàng)建子進(jìn)程實(shí)例
????for?i?in?range(2):
????????p=Process(target=worker,name="worker"+str(i),args=())
????????ps.append(p)
?
????#?開(kāi)啟進(jìn)程
????for?i?in?range(2):
????????ps[i].start()
?
????#?阻塞進(jìn)程
????for?i?in?range(2):
????????ps[i].join()
?
????print("主進(jìn)程終止")
?
if?__name__?==?'__main__':?? #當(dāng)本程序被python執(zhí)行的時(shí)候,執(zhí)行包含的內(nèi)容main()
????main()
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/xuefeifei/p/9758702.html
總結(jié)
以上是生活随笔為你收集整理的第13次预习课-20180919 多进程编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [Swift]LeetCode326.
- 下一篇: 为不同的屏幕尺寸提供不同的图片(为那些没