Python 線程與進程

Python 線程與進程

Python由于有全鎖局的存在(同一時間只能有一個線程執(zhí)行)雏赦,并不能利用多核優(yōu)勢挎袜。所以助琐,如果程序的多線程進程是CPU密集型的符隙,那多線程并不能帶來效率上的提升憎账,相反還可能會因為線程的頻繁切換套硼,導致效率下降;如果是IO密集型胞皱,多線程進程可以利用IO阻塞等待時的空閑時間執(zhí)行其他線程邪意,提升效率看政。

但我們總會有在程序中實現多并發(fā)來提升程序運行效率的情形。在這些情形下抄罕,可以適當的利用多進程來實現提升效率允蚣。

另外,python中呆贿,為了解決網絡請求密集中嚷兔,延時等待的問題,我們還可是使用協程來提交效率。

在于IO密集型程序中饱狂,多線程應用較多惜颇。
但在網絡請求密集中,協程比多線程強上很多壶运。
在CPU密集中,還是進程應用更多浪秘。
以下是三個例子:

線程:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import threading
import time, datetime


# 為線程定義一個函數
def print_time(thread_name):
    for i in range(3):
        now = datetime.datetime.now()
        print(now, thread_name)
        time.sleep(1)

# 不帶線程處理的程序
for i in range(5):
    threadname = "threadName" + str(i)
    print_time(threadname)

#線程處理
# for i in range(5):
#     threadname = "threadName"+str(i)
#     t = threading.Thread(target=print_time(threadname))
#     t.start()

運行發(fā)現蒋情,不帶線程處理的程序和線程處理的程序運行順序是一樣的:

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/caobo/PycharmProjects/ThreadTest/threadTest.py

2017-11-08 11:55:32.889184 threadName0
2017-11-08 11:55:33.890456 threadName0
2017-11-08 11:55:34.894145 threadName0
2017-11-08 11:55:35.899107 threadName1
2017-11-08 11:55:36.900408 threadName1
2017-11-08 11:55:37.903821 threadName1
2017-11-08 11:55:38.907008 threadName2
2017-11-08 11:55:39.909538 threadName2
2017-11-08 11:55:40.914680 threadName2
2017-11-08 11:55:41.918500 threadName3
2017-11-08 11:55:42.921579 threadName3
2017-11-08 11:55:43.925748 threadName3
2017-11-08 11:55:44.928359 threadName4
2017-11-08 11:55:45.931913 threadName4
2017-11-08 11:55:46.932414 threadName4

Process finished with exit code 0

每個線程執(zhí)行完需要3秒,依次執(zhí)行線程耸携,總耗時15秒棵癣。

進程

# 進程處理
if __name__ == "__main__":
    for i in range(5):
        threadName = "threadName" + str(i)
        p = multiprocessing.Process(target=print_time, args=(threadName,))
        p.start()

進程處理運行結果如下:

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/caobo/PycharmProjects/ThreadTest/threadTest.py
2017-11-08 11:58:44.045175 threadName0
2017-11-08 11:58:44.046196 threadName1
2017-11-08 11:58:44.047036 threadName2
2017-11-08 11:58:44.048071 threadName3
2017-11-08 11:58:44.049010 threadName4
2017-11-08 11:58:45.045841 threadName0
2017-11-08 11:58:45.046783 threadName1
2017-11-08 11:58:45.048291 threadName2
2017-11-08 11:58:45.048476 threadName3
2017-11-08 11:58:45.050095 threadName4
2017-11-08 11:58:46.046989 threadName0
2017-11-08 11:58:46.047063 threadName1
2017-11-08 11:58:46.048629 threadName2
2017-11-08 11:58:46.049239 threadName3
2017-11-08 11:58:46.050937 threadName4

Process finished with exit code 0

每個進程執(zhí)行完需要3秒,并發(fā)執(zhí)行線程夺衍,總耗時3秒狈谊。

進程池

# 進程池處理
if __name__ == "__main__":
    pool = multiprocessing.Pool(processes=4)
    for i in range(5):
        threadName = "threadName" + str(i)
        pool.apply_async(print_time, (threadName,))
    pool.close()
    pool.join()
    print("Sub-process(es) done.")

進程池處理結果如下:

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/caobo/PycharmProjects/ThreadTest/threadTest.py
2017-11-08 12:01:03.557402 threadName0
2017-11-08 12:01:03.557552 threadName1
2017-11-08 12:01:03.557686 threadName2
2017-11-08 12:01:03.557827 threadName3
2017-11-08 12:01:04.558322 threadName2
2017-11-08 12:01:04.558306 threadName0
2017-11-08 12:01:04.558311 threadName1
2017-11-08 12:01:04.558322 threadName3
2017-11-08 12:01:05.558841 threadName1
2017-11-08 12:01:05.558833 threadName2
2017-11-08 12:01:05.558841 threadName0
2017-11-08 12:01:05.558845 threadName3
2017-11-08 12:01:06.560105 threadName4
2017-11-08 12:01:07.561340 threadName4
2017-11-08 12:01:08.561577 threadName4
Sub-process(es) done.

Process finished with exit code 0

由于設置了進程并發(fā)的數量為4,所以沟沙,前三秒執(zhí)行的都是前四個進程的內容(每個進程執(zhí)行完需要三秒)河劝,進程5只能在前四個進程執(zhí)行完成之后,才開始執(zhí)行矛紫∈晗梗總耗時6秒。

修改進程并發(fā)數量為5:

# 進程池處理
if __name__ == "__main__":
    pool = multiprocessing.Pool(processes=5)
    for i in range(5):
        threadName = "threadName" + str(i)
        pool.apply_async(print_time, (threadName,))
    pool.close()
    pool.join()
    print("Sub-process(es) done.")

運行結果如下:

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/caobo/PycharmProjects/ThreadTest/threadTest.py
2017-11-08 12:12:17.210982 threadName0
2017-11-08 12:12:17.211084 threadName1
2017-11-08 12:12:17.211188 threadName2
2017-11-08 12:12:17.211335 threadName3
2017-11-08 12:12:17.211451 threadName4
2017-11-08 12:12:18.211480 threadName0
2017-11-08 12:12:18.211481 threadName2
2017-11-08 12:12:18.211480 threadName1
2017-11-08 12:12:18.211785 threadName3
2017-11-08 12:12:18.211787 threadName4
2017-11-08 12:12:19.211773 threadName2
2017-11-08 12:12:19.211784 threadName0
2017-11-08 12:12:19.212676 threadName1
2017-11-08 12:12:19.212679 threadName4
2017-11-08 12:12:19.212679 threadName3
Sub-process(es) done.

Process finished with exit code 0

修改設置進程并發(fā)的數量為5含衔,所以煎娇,所有5個進程能夠同步執(zhí)行。每個進程執(zhí)行完需要三秒贪染,總耗時3秒缓呛。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市杭隙,隨后出現的幾起案子哟绊,更是在濱河造成了極大的恐慌,老刑警劉巖痰憎,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件票髓,死亡現場離奇詭異攀涵,居然都是意外死亡,警方通過查閱死者的電腦和手機洽沟,發(fā)現死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門以故,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人裆操,你說我怎么就攤上這事怒详。” “怎么了踪区?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵昆烁,是天一觀的道長。 經常有香客問我缎岗,道長静尼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任传泊,我火速辦了婚禮鼠渺,結果婚禮上,老公的妹妹穿的比我還像新娘或渤。我一直安慰自己系冗,他們只是感情好奕扣,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布薪鹦。 她就那樣靜靜地躺著,像睡著了一般惯豆。 火紅的嫁衣襯著肌膚如雪池磁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天楷兽,我揣著相機與錄音地熄,去河邊找鬼。 笑死芯杀,一個胖子當著我的面吹牛端考,可吹牛的內容都是我干的。 我是一名探鬼主播揭厚,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼却特,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了筛圆?” 一聲冷哼從身側響起裂明,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎太援,沒想到半個月后闽晦,有當地人在樹林里發(fā)現了一具尸體扳碍,經...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年仙蛉,在試婚紗的時候發(fā)現自己被綠了笋敞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡荠瘪,死狀恐怖液样,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情巧还,我是刑警寧澤鞭莽,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站麸祷,受9級特大地震影響澎怒,放射性物質發(fā)生泄漏。R本人自食惡果不足惜阶牍,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一喷面、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧走孽,春花似錦惧辈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至困食,卻和暖如春边翁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硕盹。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工符匾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瘩例。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓啊胶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親垛贤。 傳聞我的和親對象是個殘疾皇子焰坪,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內容

  • 又來到了一個老生常談的問題,應用層軟件開發(fā)的程序員要不要了解和深入學習操作系統(tǒng)呢南吮? 今天就這個問題開始琳彩,來談談操...
    tangsl閱讀 4,124評論 0 23
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,085評論 25 707
  • 大家好,我是悠貝南山保利繪本館的真真老師。今天露乏,要為大家推薦的繪本是《花婆婆》—做個愛的使者碧浊。 也許你還沒有來得及...
    茍茍的腳步_繪本與成長閱讀 2,097評論 0 3
  • 都說家有一老,好有一寶瘟仿,我是幸運的箱锐,有兩寶,在他們身上讓你真真切切體會到什么才是患難與共劳较,相濡以沫驹止。作為女兒有這樣...
    馬德水閱讀 325評論 0 1
  • 我們把我們所擁有的最好的東西送給別人,直到我們的愛再也沒有東西可以送出為止观蜗,但是臊恋,我們最好的東西在別人看來,不一定...
    青衫濕舊閱讀 433評論 21 23