亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

簡述Python中的進程、線程、協程

2020-01-04 17:36:14
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Python中的進程、線程、協程的相關資料,需要的朋友可以參考下
 

進程、線程和協程之間的關系和區別也困擾我一陣子了,最近有一些心得,寫一下。

進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系統調度。

線程擁有自己獨立的棧和共享的堆,共享堆,不共享棧,線程亦由操作系統調度(標準線程是的)。

協程和線程一樣共享堆,不共享棧,協程由程序員在協程的代碼里顯示調度。

進程和其他兩個的區別還是很明顯的。

協程和線程的區別是:協程避免了無意義的調度,由此可以提高性能,但也因此,程序員必須自己承擔調度的責任,同時,協程也失去了標準線程使用多CPU的能力。

Python線程

定義:Threading用于提供線程相關的操作,線程是應用程序中工作的最小單元。

#!/usr/bin/env python# -*- coding:utf-8 -*-import threadingimport timedef show(arg):time.sleep(1)print 'thread'+str(arg)for i in range(10):t = threading.Thread(target=show, args=(i,))t.start()print 'main thread stop 

上述代碼創建了10個“前臺”線程,然后控制器就交給了CPU,CPU根據指定算法進行調度,分片執行指令。

更多方法:

•start 線程準備就緒,等待CPU調度

•setName 為線程設置名稱

•getName 獲取線程名稱

•setDaemon 設置為后臺線程或前臺線程(默認)

如果是后臺線程,主線程執行過程中,后臺線程也在進行,主線程執行完畢后,后臺線程不論成功與否,均停止

如果是前臺線程,主線程執行過程中,前臺線程也在進行,主線程執行完畢后,等待前臺線程也執行完成后,程序停止

•join 逐個執行每個線程,執行完畢后繼續往下執行,該方法使得多線程變得無意義

•run 線程被cpu調度后自動執行線程對象的run方法 

線程鎖

由于線程之間是進行隨機調度,并且每個線程可能只執行n條執行之后,CPU接著執行其他線程。所以,可能出現如下問題:

import threadingimport timegl_num = 0def show(arg):global gl_numtime.sleep(1)gl_num +=1print gl_numfor i in range(10):t = threading.Thread(target=show, args=(i,))t.start()print 'main thread stop' import threadingimport timegl_num = 0lock = threading.RLock()def Func():lock.acquire()global gl_numgl_num +=1time.sleep(1)print gl_numlock.release()for i in range(10):t = threading.Thread(target=Func)t.start() 

event

python線程的事件用于主線程控制其他線程的執行,事件主要提供了三個方法 set、wait、clear。

事件處理的機制:全局定義了一個“Flag”,如果“Flag”值為 False,那么當程序執行 event.wait 方法時就會阻塞,如果“Flag”值為True,那么event.wait 方法時便不再阻塞。

•clear:將“Flag”設置為False

•set:將“Flag”設置為True

#!/usr/bin/env python# -*- coding:utf-8 -*-import threadingdef do(event):print 'start'event.wait()print 'execute'event_obj = threading.Event()for i in range(10):t = threading.Thread(target=do, args=(event_obj,))t.start()event_obj.clear()inp = raw_input('input:')if inp == 'true':event_obj.set() 

Python 進程

from multiprocessing import Processimport threadingimport timedef foo(i):print 'say hi',ifor i in range(10):p = Process(target=foo,args=(i,))p.start() 

注意:由于進程之間的數據需要各自持有一份,所以創建進程需要的非常大的開銷。

進程數據共享

進程各自持有一份數據,默認無法共享數據

#!/usr/bin/env python#coding:utf-8from multiprocessing import Processfrom multiprocessing import Managerimport timeli = []def foo(i):li.append(i)print 'say hi',lifor i in range(10):p = Process(target=foo,args=(i,))p.start()print ('ending',li) 

#方法一,Array

from multiprocessing import Process,Arraytemp = Array('i', [11,22,33,44])def Foo(i):temp[i] = 100+ifor item in temp:print i,'----->',itemfor i in range(2):p = Process(target=Foo,args=(i,))p.start()

#方法二:manage.dict()共享數據

from multiprocessing import Process,Managermanage = Manager()dic = manage.dict()def Foo(i):dic[i] = 100+iprint dic.values()for i in range(2):p = Process(target=Foo,args=(i,))p.start()p.join() 'c': ctypes.c_char, 'u': ctypes.c_wchar,'b': ctypes.c_byte, 'B': ctypes.c_ubyte,'h': ctypes.c_short, 'H': ctypes.c_ushort,'i': ctypes.c_int, 'I': ctypes.c_uint,'l': ctypes.c_long, 'L': ctypes.c_ulong,'f': ctypes.c_float, 'd': ctypes.c_double 

當創建進程時(非使用時),共享數據會被拿到子進程中,當進程中執行完畢后,再賦值給原值。

#!/usr/bin/env python# -*- coding:utf-8 -*-from multiprocessing import Process, Array, RLockdef Foo(lock,temp,i):"""將第0個數加100"""lock.acquire()temp[0] = 100+ifor item in temp:print i,'----->',itemlock.release()lock = RLock()temp = Array('i', [11, 22, 33, 44])for i in range(20):p = Process(target=Foo,args=(lock,temp,i,))p.start() 

進程池

進程池內部維護一個進程序列,當使用時,則去進程池中獲取一個進程,如果進程池序列中沒有可供使用的進進程,那么程序就會等待,直到進程池中有可用進程為止。

進程池中有兩個方法:

•apply

•apply_async

#!/usr/bin/env python# -*- coding:utf-8 -*-from multiprocessing import Process,Poolimport timedef Foo(i):time.sleep(2)return i+100def Bar(arg):print argpool = Pool(5)#print pool.apply(Foo,(1,))#print pool.apply_async(func =Foo, args=(1,)).get()for i in range(10):pool.apply_async(func=Foo, args=(i,),callback=Bar)print 'end'pool.close()

pool.join()#進程池中進程執行完畢后再關閉,如果注釋,那么程序直接關閉

協程

線程和進程的操作是由程序觸發系統接口,最后的執行者是系統;協程的操作則是程序員。

協程存在的意義:對于多線程應用,CPU通過切片的方式來切換線程間的執行,線程切換時需要耗時(保存狀態,下次繼續)。協程,則只使用一個線程,在一個線程中規定某個代碼塊執行順序。

協程的適用場景:當程序中存在大量不需要CPU的操作時(IO),適用于協程;

greenlet

#!/usr/bin/env python# -*- coding:utf-8 -*-from greenlet import greenletdef test1():print 12gr2.switch()print 34gr2.switch()def test2():print 56gr1.switch()print 78gr1 = greenlet(test1)gr2 = greenlet(test2)gr1.switch() 

gevent

import geventdef foo():print('Running in foo')gevent.sleep(0)print('Explicit context switch to foo again')def bar():print('Explicit context to bar')gevent.sleep(0)print('Implicit context switch back to bar')gevent.joinall([gevent.spawn(foo),gevent.spawn(bar),]) 

遇到IO操作自動切換:

from gevent import monkey; monkey.patch_all()import geventimport urllib2def f(url):print('GET: %s' % url)resp = urllib2.urlopen(url)data = resp.read()print('%d bytes received from %s.' % (len(data), url))gevent.joinall([gevent.spawn(f, 'https://www.python.org/'),gevent.spawn(f, 'https://www.yahoo.com/'),gevent.spawn(f, 'https://m.vevb.com/'),]) 

以上所述是小編給大家介紹的Python中的進程、線程、協程的相關知識,希望對大家有所幫助!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频男人的天堂| 日本精品视频在线观看| 亚洲一区999| 国产精品91一区| 一区二区三区天堂av| 91大神在线播放精品| 日韩中文在线中文网在线观看| 热99在线视频| 国产精品一区二区久久国产| 国产欧美韩国高清| 国内自拍欧美激情| 亚洲人成亚洲人成在线观看| 日韩高清电影免费观看完整版| 国产美女扒开尿口久久久| 成人网址在线观看| 国产成人av网址| 欧美午夜激情在线| 国产一区在线播放| 国产在线观看精品一区二区三区| 亚洲国产欧美一区二区三区同亚洲| 欧美性xxxx在线播放| 美女国内精品自产拍在线播放| 欧美性生活大片免费观看网址| 91福利视频在线观看| 狠狠爱在线视频一区| 最近免费中文字幕视频2019| 欧美日韩免费观看中文| 91欧美视频网站| 国产一区二区三区久久精品| 欧美视频精品一区| 韩国一区二区电影| 97视频免费在线看| 亚洲а∨天堂久久精品喷水| 日韩在线观看免费网站| 欧美性猛交xxxx免费看漫画| 日韩在线视频免费观看高清中文| 国产精品久久久久久av福利软件| 欧美激情免费视频| 国产精品视频99| 国产欧美精品久久久| 亚洲国内精品视频| 亚洲日韩欧美视频一区| 欧美色videos| 一区二区三区视频免费| 美女扒开尿口让男人操亚洲视频网站| 亚洲国产精品人久久电影| 欧美日韩第一视频| 亚洲国产精品va在线| 91精品久久久久久久久久入口| 这里只有精品在线播放| 日本欧美一二三区| 91精品视频免费| 欧美成人性生活| 成人一区二区电影| 亚洲色图欧美制服丝袜另类第一页| 国产精品久久久久久久久久新婚| 亚洲激情视频在线| 高清一区二区三区日本久| 亚洲成人av中文字幕| 国内免费精品永久在线视频| 国产成人久久精品| 91产国在线观看动作片喷水| 日本精品一区二区三区在线| 色婷婷综合久久久久中文字幕1| 在线播放日韩欧美| 亚洲天堂网站在线观看视频| 91亚洲精品久久久| 一区二区欧美在线| 久久躁日日躁aaaaxxxx| 91精品国产高清久久久久久久久| 国产精品欧美激情在线播放| 96精品久久久久中文字幕| 欧美自拍视频在线| 青青草99啪国产免费| 日韩小视频网址| 欧美夫妻性视频| 日韩美女视频中文字幕| 91精品国产91久久久久| 日韩成人黄色av| 69久久夜色精品国产69乱青草| 91在线免费网站| 综合激情国产一区| 国产成人av网址| 亚洲人成电影网站色| 欧美一级电影久久| 亚洲午夜久久久影院| 欧美一区二区大胆人体摄影专业网站| 欧美成人激情在线| 国语自产在线不卡| 中文字幕在线观看亚洲| 高跟丝袜欧美一区| 国产69精品久久久| 欧美视频第一页| 国产精品热视频| 精品在线欧美视频| 欧美日韩国产一区中文午夜| 久久久久国产精品www| 精品国产美女在线| 欧美日韩电影在线观看| 亚洲欧美日韩一区二区在线| 国产精品青草久久久久福利99| 91九色蝌蚪国产| 午夜精品视频网站| 欧美极品xxxx| 亚洲成在人线av| 欧美另类极品videosbest最新版本| 国内精品中文字幕| 亚洲欧美日韩一区二区在线| 欧美韩国理论所午夜片917电影| 日韩中文视频免费在线观看| 国产欧美精品日韩| 亚洲欧洲免费视频| 国产激情久久久久| 国产精品免费久久久久久| 日韩精品在线观看一区| 欧美激情一级欧美精品| 亚洲天堂第二页| 欧美在线欧美在线| 欧美激情国产日韩精品一区18| 国产日韩av在线播放| 日韩中文字幕久久| 日韩精品中文字幕久久臀| 中文字幕久热精品视频在线| 国产高清视频一区三区| 亚洲自拍偷拍一区| 久久久久久久国产精品视频| 国产视频久久久久| 午夜精品一区二区三区av| 精品欧美aⅴ在线网站| 美女视频久久黄| 日韩国产高清污视频在线观看| 国产女同一区二区| 亚洲精品第一页| 欧美激情在线观看视频| 国产精品视频在线观看| 亚洲字幕在线观看| 91国产精品电影| 久久久精品国产一区二区| 91久久中文字幕| 国产精品日韩精品| 亚洲a在线播放| 亚洲精品免费网站| 在线观看成人黄色| 国产精品专区一| 成人乱色短篇合集| 国产精品欧美久久久| www国产亚洲精品久久网站| 91精品视频在线免费观看| 亚洲黄色av网站| 欧美日韩第一页| 2019日本中文字幕| 欧美激情一二区| 色偷偷91综合久久噜噜| 日本伊人精品一区二区三区介绍| 97视频免费在线看| 国产va免费精品高清在线观看| 国产亚洲人成a一在线v站| 国产精品美女视频网站| 日韩av中文字幕在线免费观看| 欧美视频在线观看免费| 热99久久精品| 久99九色视频在线观看| 久久精品国产精品| 蜜臀久久99精品久久久无需会员|