Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
PythonÏß³ÌÖ¸ÄÏ
 
  4238  次浏览      27
 2018-1-19 
 
±à¼­ÍƼö:
À´Ô´ÓÚcnblogs£¬±¾ÎĽéÉÜÁËPython¶ÔÓÚÏ̵߳ÄÖ§³Ö£¬°üÀ¨¡°Ñ§»á¡±¶àÏ̱߳à³ÌÐèÒªÕÆÎյĻù´¡ÒÔ¼°PythonÁ½¸öÏ̱߳ê×¼¿âµÄÍêÕû½éÉܼ°Ê¹ÓÃʾÀý¡£

1. Ï̻߳ù´¡

1.1. Ïß³Ì״̬

Ïß³ÌÓÐ5ÖÖ״̬£¬×´Ì¬×ª»»µÄ¹ý³ÌÈçÏÂͼËùʾ£º

1.2. Ïß³Ìͬ²½£¨Ëø£©

¶àÏ̵߳ÄÓÅÊÆÔÚÓÚ¿ÉÒÔͬʱÔËÐжà¸öÈÎÎñ£¨ÖÁÉٸоõÆðÀ´ÊÇÕâÑù£©¡£µ«Êǵ±Ïß³ÌÐèÒª¹²ÏíÊý¾Ýʱ£¬¿ÉÄÜ´æÔÚÊý¾Ý²»Í¬²½µÄÎÊÌâ¡£¿¼ÂÇÕâÑùÒ»ÖÖÇé¿ö£ºÒ»¸öÁбíÀïËùÓÐÔªËØ¶¼ÊÇ0£¬Ïß³Ì"set"´ÓºóÏòǰ°ÑËùÓÐÔªËØ¸Ä³É1£¬¶øÏß³Ì"print"¸ºÔð´ÓǰÍùºó¶ÁÈ¡ÁÐ±í²¢´òÓ¡¡£ÄÇô£¬¿ÉÄÜÏß³Ì"set"¿ªÊ¼¸ÄµÄʱºò£¬Ïß³Ì"print"±ãÀ´´òÓ¡ÁбíÁË£¬Êä³ö¾Í³ÉÁËÒ»°ë0Ò»°ë1£¬Õâ¾ÍÊÇÊý¾ÝµÄ²»Í¬²½¡£ÎªÁ˱ÜÃâÕâÖÖÇé¿ö£¬ÒýÈëÁËËøµÄ¸ÅÄî¡£

ËøÓÐÁ½ÖÖ״̬¡ª¡ªËø¶¨ºÍÎ´Ëø¶¨¡£Ã¿µ±Ò»¸öÏ̱߳ÈÈç"set"Òª·ÃÎʹ²ÏíÊý¾Ýʱ£¬±ØÐëÏÈ»ñµÃËø¶¨£»Èç¹ûÒѾ­ÓбðµÄÏ̱߳ÈÈç"print"»ñµÃËø¶¨ÁË£¬ÄÇô¾ÍÈÃÏß³Ì"set"ÔÝÍ££¬Ò²¾ÍÊÇͬ²½×èÈû£»µÈµ½Ïß³Ì"print"·ÃÎÊÍê±Ï£¬ÊÍ·ÅËøÒÔºó£¬ÔÙÈÃÏß³Ì"set"¼ÌÐø¡£¾­¹ýÕâÑùµÄ´¦Àí£¬´òÓ¡ÁбíʱҪôȫ²¿Êä³ö0£¬ÒªÃ´È«²¿Êä³ö1£¬²»»áÔÙ³öÏÖÒ»°ë0Ò»°ë1µÄÞÏÞγ¡Ãæ¡£

Ïß³ÌÓëËøµÄ½»»¥ÈçÏÂͼËùʾ£º

1.3. Ïß³ÌͨÐÅ£¨Ìõ¼þ±äÁ¿£©

È»¶ø»¹ÓÐÁíÍâÒ»ÖÖÞÏÞεÄÇé¿ö£ºÁÐ±í²¢²»ÊÇÒ»¿ªÊ¼¾ÍÓеģ»¶øÊÇͨ¹ýÏß³Ì"create"´´½¨µÄ¡£Èç¹û"set"»òÕß"print" ÔÚ"create"»¹Ã»ÓÐÔËÐеÄʱºò¾Í·ÃÎÊÁÐ±í£¬½«»á³öÏÖÒ»¸öÒì³£¡£Ê¹ÓÃËø¿ÉÒÔ½â¾öÕâ¸öÎÊÌ⣬µ«ÊÇ"set"ºÍ"print"½«ÐèÒªÒ»¸öÎÞÏÞÑ­»·¡ª¡ªËûÃDz»ÖªµÀ"create"ʲôʱºò»áÔËÐУ¬ÈÃ"create"ÔÚÔËÐкó֪ͨ"set"ºÍ"print"ÏÔÈ»ÊÇÒ»¸ö¸üºÃµÄ½â¾ö·½°¸¡£ÓÚÊÇ£¬ÒýÈëÁËÌõ¼þ±äÁ¿¡£

Ìõ¼þ±äÁ¿ÔÊÐíÏ̱߳ÈÈç"set"ºÍ"print"ÔÚÌõ¼þ²»Âú×ãµÄʱºò£¨ÁбíΪNoneʱ£©µÈ´ý£¬µÈµ½Ìõ¼þÂú×ãµÄʱºò£¨ÁбíÒѾ­´´½¨£©·¢³öÒ»¸ö֪ͨ£¬¸æËß"set" ºÍ"print"Ìõ¼þÒѾ­ÓÐÁË£¬ÄãÃÇ¸ÃÆð´²¸É»îÁË£»È»ºó"set"ºÍ"print"²Å¼ÌÐøÔËÐС£

Ïß³ÌÓëÌõ¼þ±äÁ¿µÄ½»»¥ÈçÏÂͼËùʾ£º

1.4. Ïß³ÌÔËÐкÍ×èÈûµÄ״̬ת»»

×îºó¿´¿´Ïß³ÌÔËÐкÍ×èÈû״̬µÄת»»¡£

×èÈûÓÐÈýÖÖÇé¿ö£º

ͬ²½×èÈûÊÇÖ¸´¦ÓÚ¾ºÕùËø¶¨µÄ״̬£¬Ïß³ÌÇëÇóËø¶¨Ê±½«½øÈëÕâ¸ö״̬£¬Ò»µ©³É¹¦»ñµÃËø¶¨ÓÖ»Ö¸´µ½ÔËÐÐ״̬£»

µÈ´ý×èÈûÊÇÖ¸µÈ´ýÆäËûÏß³Ì֪ͨµÄ״̬£¬Ï̻߳ñµÃÌõ¼þËø¶¨ºó£¬µ÷Óᰵȴý¡±½«½øÈëÕâ¸ö״̬£¬Ò»µ©ÆäËûÏ̷߳¢³ö֪ͨ£¬Ï߳̽«½øÈëͬ²½×èÈû״̬£¬ÔٴξºÕùÌõ¼þËø¶¨£»

¶øÆäËû×èÈûÊÇÖ¸µ÷ÓÃtime.sleep()¡¢anotherthread.join()»òµÈ´ýIOʱµÄ×èÈû£¬Õâ¸ö״̬ÏÂÏ̲߳»»áÊÍ·ÅÒÑ»ñµÃµÄËø¶¨¡£

tips: Èç¹ûÄÜÀí½âÕâЩÄÚÈÝ£¬½ÓÏÂÀ´µÄÖ÷Ì⽫ÊǷdz£ÇáËɵ컲¢ÇÒ£¬ÕâЩÄÚÈÝÔڴ󲿷ÖÁ÷Ðеıà³ÌÓïÑÔÀï¶¼ÊÇÒ»ÑùµÄ¡££¨Òâ˼¾ÍÊÇ·Ç¿´¶®²»¿É >_< ÏÓ×÷ÕßˮƽµÍÕÒ±ðÈ˵Ľ̳ÌÒ²Òª¿´¶®£©

2. thread

Pythonͨ¹ýÁ½¸ö±ê×¼¿âthreadºÍthreadingÌṩ¶ÔÏ̵߳ÄÖ§³Ö¡£threadÌṩÁ˵ͼ¶±ðµÄ¡¢Ô­Ê¼µÄÏß³ÌÒÔ¼°Ò»¸ö¼òµ¥µÄËø¡£

# encoding: UTF-8
import thread
import time

# Ò»¸öÓÃÓÚÔÚÏß³ÌÖÐÖ´Ðеĺ¯Êý
def func():
for i in range(5):
print 'func'
time.sleep(1)

# ½áÊøµ±Ç°Ïß³Ì
# Õâ¸ö·½·¨Óëthread.exit_thread()µÈ¼Û
thread.exit() # µ±func·µ»ØÊ±£¬Ïß³ÌͬÑù»á½áÊø

# Æô¶¯Ò»¸öỊ̈߳¬Ïß³ÌÁ¢¼´¿ªÊ¼ÔËÐÐ
# Õâ¸ö·½·¨Óëthread.start_new_thread()µÈ¼Û
# µÚÒ»¸ö²ÎÊýÊÇ·½·¨£¬µÚ¶þ¸ö²ÎÊýÊÇ·½·¨µÄ²ÎÊý
thread.start_new(func, ()) # ·½·¨Ã»ÓвÎÊýʱÐèÒª´«Èë¿Õtuple

# ´´½¨Ò»¸öËø£¨LockType£¬²»ÄÜÖ±½ÓʵÀý»¯£©
# Õâ¸ö·½·¨Óëthread.allocate_lock()µÈ¼Û
lock = thread.allocate()

# ÅжÏËøÊÇËø¶¨×´Ì¬»¹ÊÇÊÍ·Å״̬
print lock.locked()

# ËøÍ¨³£ÓÃÓÚ¿ØÖƶԹ²Ïí×ÊÔ´µÄ·ÃÎÊ
count = 0

# »ñµÃËø£¬³É¹¦»ñµÃËø¶¨ºó·µ»ØTrue
# ¿ÉÑ¡µÄtimeout²ÎÊý²»Ìîʱ½«Ò»Ö±×èÈûÖ±µ½»ñµÃËø¶¨
# ·ñÔò³¬Ê±ºó½«·µ»ØFalse
if lock.acquire():
count += 1

# ÊÍ·ÅËø
lock.release()

# threadÄ£¿éÌṩµÄÏ̶߳¼½«ÔÚÖ÷Ï߳̽áÊøºóͬʱ½áÊø
time.sleep(6)

thread Ä£¿éÌṩµÄÆäËû·½·¨£º

thread.interrupt_main(): ÔÚÆäËûÏß³ÌÖÐÖÕÖ¹Ö÷Ï̡߳£

thread.get_ident(): »ñµÃÒ»¸ö´ú±íµ±Ç°Ï̵߳Äħ·¨Êý×Ö£¬³£ÓÃÓÚ´ÓÒ»¸ö×ÖµäÖлñµÃÏß³ÌÏà¹ØµÄÊý¾Ý¡£Õâ¸öÊý×Ö±¾ÉíûÓÐÈκκ¬Ò壬²¢ÇÒµ±Ï߳̽áÊøºó»á±»ÐÂÏ̸߳´Óá£

thread»¹ÌṩÁËÒ»¸öThreadLocalÀàÓÃÓÚ¹ÜÀíÏß³ÌÏà¹ØµÄÊý¾Ý£¬ÃûΪ thread._local£¬threadingÖÐÒýÓÃÁËÕâ¸öÀà¡£

ÓÉÓÚthreadÌṩµÄÏ̹߳¦Äܲ»¶à£¬ÎÞ·¨ÔÚÖ÷Ï߳̽áÊøºó¼ÌÐøÔËÐУ¬²»ÌṩÌõ¼þ±äÁ¿µÈµÈÔ­Òò£¬Ò»°ã²»Ê¹ÓÃthreadÄ£¿é£¬ÕâÀï¾Í²»¶à½éÉÜÁË¡£

3. threading

threading»ùÓÚJavaµÄÏß³ÌÄ£ÐÍÉè¼Æ¡£Ëø£¨Lock£©ºÍÌõ¼þ±äÁ¿£¨Condition£©ÔÚJavaÖÐÊǶÔÏóµÄ»ù±¾ÐÐΪ£¨Ã¿Ò»¸ö¶ÔÏó¶¼×Ô´øÁËËøºÍÌõ¼þ±äÁ¿£©£¬¶øÔÚPythonÖÐÔòÊǶÀÁ¢µÄ¶ÔÏó¡£Python ThreadÌṩÁËJava ThreadµÄÐÐΪµÄ×Ó¼¯£»Ã»ÓÐÓÅÏȼ¶¡¢Ïß³Ì×飬Ïß³ÌÒ²²»Äܱ»Í£Ö¹¡¢ÔÝÍ£¡¢»Ö¸´¡¢Öжϡ£Java ThreadÖеIJ¿·Ö±»PythonʵÏÖÁ˵ľ²Ì¬·½·¨ÔÚthreadingÖÐÒÔÄ£¿é·½·¨µÄÐÎʽÌṩ¡£

threading Ä£¿éÌṩµÄ³£Ó÷½·¨£º

threading.currentThread(): ·µ»Øµ±Ç°µÄÏ̱߳äÁ¿¡£

threading.enumerate(): ·µ»ØÒ»¸ö°üº¬ÕýÔÚÔËÐеÄÏ̵߳Älist¡£ÕýÔÚÔËÐÐÖ¸Ïß³ÌÆô¶¯ºó¡¢½áÊøÇ°£¬²»°üÀ¨Æô¶¯Ç°ºÍÖÕÖ¹ºóµÄÏ̡߳£

threading.activeCount(): ·µ»ØÕýÔÚÔËÐеÄÏß³ÌÊýÁ¿£¬Óëlen(threading.enumerate())ÓÐÏàͬµÄ½á¹û¡£

threadingÄ£¿éÌṩµÄÀࣺ

Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local.

3.1. Thread

ThreadÊÇÏß³ÌÀ࣬ÓëJavaÀàËÆ£¬ÓÐÁ½ÖÖʹÓ÷½·¨£¬Ö±½Ó´«ÈëÒªÔËÐеķ½·¨»ò´ÓThread¼Ì³Ð²¢¸²¸Çrun()£º

# encoding: UTF-8
import threading

# ·½·¨1£º½«ÒªÖ´Ðеķ½·¨×÷Ϊ²ÎÊý´«¸øThreadµÄ¹¹Ôì·½·¨
def func():
print 'func() passed to Thread'

t = threading.Thread(target=func)
t.start()

# ·½·¨2£º´ÓThread¼Ì³Ð£¬²¢ÖØÐ´run()
class MyThread(threading.Thread):
def run(self):
print 'MyThread extended from Thread'

t = MyThread()
t.start()

¹¹Ôì·½·¨£º

Thread(group=None, target=None, name=None, args=(), kwargs={})

group: Ïß³Ì×飬Ŀǰ»¹Ã»ÓÐʵÏÖ£¬¿âÒýÓÃÖÐÌáʾ±ØÐëÊÇNone£»

target: ÒªÖ´Ðеķ½·¨£»

name: Ïß³ÌÃû£»

args/kwargs: Òª´«Èë·½·¨µÄ²ÎÊý¡£

ʵÀý·½·¨£º

isAlive(): ·µ»ØÏß³ÌÊÇ·ñÔÚÔËÐС£ÕýÔÚÔËÐÐÖ¸Æô¶¯ºó¡¢ÖÕֹǰ¡£

get/setName(name): »ñÈ¡/ÉèÖÃÏß³ÌÃû¡£

is/setDaemon(bool): »ñÈ¡/ÉèÖÃÊÇ·ñÊØ»¤Ï̡߳£³õʼֵ´Ó´´½¨¸ÃÏ̵߳ÄÏ̼̳߳С£µ±Ã»ÓзÇÊØ»¤Ïß³ÌÈÔÔÚÔËÐÐʱ£¬³ÌÐò½«ÖÕÖ¹¡£

start(): Æô¶¯Ï̡߳£

join([timeout]): ×èÈûµ±Ç°ÉÏÏÂÎÄ»·¾³µÄỊ̈߳¬Ö±µ½µ÷Óô˷½·¨µÄÏß³ÌÖÕÖ¹»òµ½´ïÖ¸¶¨µÄtimeout£¨¿ÉÑ¡²ÎÊý£©¡£

Ò»¸öʹÓÃjoin()µÄÀý×Ó£º

# encoding: UTF-8
import threading
import time

def context(tJoin):
print 'in threadContext.'
tJoin.start()

# ½«×èÈûtContextÖ±µ½threadJoinÖÕÖ¹¡£
tJoin.join()

# tJoinÖÕÖ¹ºó¼ÌÐøÖ´ÐС£
print 'out threadContext.'

def join():
print 'in threadJoin.'
time.sleep(1)
print 'out threadJoin.'

tJoin = threading.Thread(target=join)
tContext = threading.Thread(target=context, args=(tJoin,))

tContext.start()

ÔËÐнá¹û£º

in threadContext.
in threadJoin.
out threadJoin.
out threadContext.

3.2. Lock

Lock£¨Ö¸ÁîËø£©ÊÇ¿ÉÓõÄ×îµÍ¼¶µÄͬ²½Ö¸Áî¡£Lock´¦ÓÚËø¶¨×´Ì¬Ê±£¬²»±»Ìض¨µÄÏß³ÌÓµÓС£Lock°üº¬Á½ÖÖ״̬¡ª¡ªËø¶¨ºÍ·ÇËø¶¨£¬ÒÔ¼°Á½¸ö»ù±¾µÄ·½·¨¡£

¿ÉÒÔÈÏΪLockÓÐÒ»¸öËø¶¨³Ø£¬µ±Ïß³ÌÇëÇóËø¶¨Ê±£¬½«Ïß³ÌÖÁÓÚ³ØÖУ¬Ö±µ½»ñµÃËø¶¨ºó³ö³Ø¡£³ØÖеÄÏ̴߳¦ÓÚ״̬ͼÖеÄͬ²½×èÈû״̬¡£

¹¹Ôì·½·¨£º

Lock()

ʵÀý·½·¨£º

acquire([timeout]): ʹÏ߳̽øÈëͬ²½×èÈû״̬£¬³¢ÊÔ»ñµÃËø¶¨¡£

release(): ÊÍ·ÅËø¡£Ê¹ÓÃǰÏ̱߳ØÐëÒÑ»ñµÃËø¶¨£¬·ñÔò½«Å׳öÒì³£¡£

# encoding: UTF-8
import threading
import time

data = 0
lock = threading.Lock()

def func():
global data
print '%s acquire lock...' % threading.currentThread().getName()

# µ÷ÓÃacquire([timeout])ʱ£¬Ï߳̽«Ò»Ö±×èÈû£¬
# Ö±µ½»ñµÃËø¶¨»òÕßÖ±µ½timeoutÃëºó£¨timeout²ÎÊý¿ÉÑ¡£©¡£
# ·µ»ØÊÇ·ñ»ñµÃËø¡£
if lock.acquire():
print '%s get the lock.' % threading.currentThread().getName()
data += 1
time.sleep(2)
print '%s release lock...' % threading.currentThread().getName()

# µ÷ÓÃrelease()½«ÊÍ·ÅËø¡£
lock.release()

t1 = threading.Thread(target=func)
t2 = threading.Thread(target=func)
t3 = threading.Thread(target=func)
t1.start()
t2.start()
t3.start()

3.3. RLock

RLock£¨¿ÉÖØÈëËø£©ÊÇÒ»¸ö¿ÉÒÔ±»Í¬Ò»¸öÏß³ÌÇëÇó¶à´ÎµÄͬ²½Ö¸Áî¡£RLockʹÓÃÁË¡°ÓµÓеÄÏ̡߳±ºÍ¡°µÝ¹éµÈ¼¶¡±µÄ¸ÅÄ´¦ÓÚËø¶¨×´Ì¬Ê±£¬RLock±»Ä³¸öÏß³ÌÓµÓС£ÓµÓÐRLockµÄÏ߳̿ÉÒÔÔٴε÷ÓÃacquire()£¬ÊÍ·ÅËøÊ±ÐèÒªµ÷ÓÃrelease()Ïàͬ´ÎÊý¡£

¿ÉÒÔÈÏΪRLock°üº¬Ò»¸öËø¶¨³ØºÍÒ»¸ö³õʼֵΪ0µÄ¼ÆÊýÆ÷£¬Ã¿´Î³É¹¦µ÷Óà acquire()/release()£¬¼ÆÊýÆ÷½«+1/-1£¬Îª0Ê±Ëø´¦ÓÚÎ´Ëø¶¨×´Ì¬¡£

¹¹Ôì·½·¨£º

RLock()

ʵÀý·½·¨£º

acquire([timeout])/release(): ¸úLock²î²»¶à¡£

# encoding: UTF-8
import threading
import time

rlock = threading.RLock()

def func():
# µÚÒ»´ÎÇëÇóËø¶¨
print '%s acquire lock...' % threading.currentThread().getName()
if rlock.acquire():
print '%s get the lock.' % threading.currentThread().getName()
time.sleep(2)

# µÚ¶þ´ÎÇëÇóËø¶¨
print '%s acquire lock again...' % threading.currentThread().getName()
if rlock.acquire():
print '%s get the lock.' % threading.currentThread().getName()
time.sleep(2)

# µÚÒ»´ÎÊÍ·ÅËø
print '%s release lock...' % threading.currentThread().getName()
rlock.release()
time.sleep(2)

# µÚ¶þ´ÎÊÍ·ÅËø
print '%s release lock...' % threading.currentThread().getName()
rlock.release()

t1 = threading.Thread(target=func)
t2 = threading.Thread(target=func)
t3 = threading.Thread(target=func)
t1.start()
t2.start()
t3.start()

3.4. Condition

Condition£¨Ìõ¼þ±äÁ¿£©Í¨³£ÓëÒ»¸öËø¹ØÁª¡£ÐèÒªÔÚ¶à¸öContidionÖй²ÏíÒ»¸öËøÊ±£¬¿ÉÒÔ´«µÝÒ»¸öLock/RLockʵÀý¸ø¹¹Ôì·½·¨£¬·ñÔòËü½«×Ô¼ºÉú³ÉÒ»¸öRLockʵÀý¡£

¿ÉÒÔÈÏΪ£¬³ýÁËLock´øÓеÄËø¶¨³ØÍ⣬Condition»¹°üº¬Ò»¸öµÈ´ý³Ø£¬³ØÖеÄÏ̴߳¦ÓÚ״̬ͼÖеĵȴý×èÈû״̬£¬Ö±µ½ÁíÒ»¸öÏ̵߳÷ÓÃnotify()/notifyAll()֪ͨ£»µÃµ½Í¨ÖªºóÏ߳̽øÈëËø¶¨³ØµÈ´ýËø¶¨¡£

¹¹Ôì·½·¨£º

Condition([lock/rlock])

ʵÀý·½·¨£º

acquire([timeout])/release(): µ÷ÓùØÁªµÄËøµÄÏàÓ¦·½·¨¡£

wait([timeout]): µ÷ÓÃÕâ¸ö·½·¨½«Ê¹Ï߳̽øÈëConditionµÄµÈ´ý³ØµÈ´ý֪ͨ£¬²¢ÊÍ·ÅËø¡£Ê¹ÓÃǰÏ̱߳ØÐëÒÑ»ñµÃËø¶¨£¬·ñÔò½«Å׳öÒì³£¡£

notify(): µ÷ÓÃÕâ¸ö·½·¨½«´ÓµÈ´ý³ØÌôѡһ¸öÏ̲߳¢Í¨Öª£¬ÊÕµ½Í¨ÖªµÄÏ߳̽«×Ô¶¯µ÷ÓÃacquire()³¢ÊÔ»ñµÃËø¶¨£¨½øÈëËø¶¨³Ø£©£»ÆäËûÏß³ÌÈÔÈ»Ôڵȴý³ØÖС£µ÷ÓÃÕâ¸ö·½·¨²»»áÊÍ·ÅËø¶¨¡£Ê¹ÓÃǰÏ̱߳ØÐëÒÑ»ñµÃËø¶¨£¬·ñÔò½«Å׳öÒì³£¡£

notifyAll(): µ÷ÓÃÕâ¸ö·½·¨½«Í¨ÖªµÈ´ý³ØÖÐËùÓеÄỊ̈߳¬ÕâЩÏ̶߳¼½«½øÈëËø¶¨³Ø³¢ÊÔ»ñµÃËø¶¨¡£µ÷ÓÃÕâ¸ö·½·¨²»»áÊÍ·ÅËø¶¨¡£Ê¹ÓÃǰÏ̱߳ØÐëÒÑ»ñµÃËø¶¨£¬·ñÔò½«Å׳öÒì³£¡£

Àý×ÓÊǺܳ£¼ûµÄÉú²úÕß/Ïû·ÑÕßģʽ£º

# encoding: UTF-8
import threading
import time

# ÉÌÆ·
product = None
# Ìõ¼þ±äÁ¿
con = threading.Condition()

# Éú²úÕß·½·¨
def produce():
global product

if con.acquire():
while True:
if product is None:
print 'produce...'
product = 'anything'

# ֪ͨÏû·ÑÕߣ¬ÉÌÆ·ÒѾ­Éú²ú
con.notify()

# µÈ´ý֪ͨ
con.wait()
time.sleep(2)

# Ïû·ÑÕß·½·¨
def consume():
global product

if con.acquire():
while True:
if product is not None:
print 'consume...'
product = None

# ֪ͨÉú²úÕߣ¬ÉÌÆ·ÒѾ­Ã»ÁË
con.notify()

# µÈ´ý֪ͨ
con.wait()
time.sleep(2)

t1 = threading.Thread(target=produce)
t2 = threading.Thread(target=consume)
t2.start()
t1.start()

3.5. Semaphore/BoundedSemaphore

Semaphore£¨ÐźÅÁ¿£©ÊǼÆËã»ú¿ÆÑ§Ê·ÉÏ×î¹ÅÀϵÄͬ²½Ö¸ÁîÖ®Ò»¡£Semaphore¹ÜÀíÒ»¸öÄÚÖõļÆÊýÆ÷£¬Ã¿µ±µ÷ÓÃacquire()ʱ-1£¬µ÷ÓÃrelease() ʱ+1¡£¼ÆÊýÆ÷²»ÄÜСÓÚ0£»µ±¼ÆÊýÆ÷Ϊ0ʱ£¬acquire()½«×èÈûÏß³ÌÖÁͬ²½Ëø¶¨×´Ì¬£¬Ö±µ½ÆäËûÏ̵߳÷ÓÃrelease()¡£

»ùÓÚÕâ¸öÌØµã£¬Semaphore¾­³£ÓÃÀ´Í¬²½Ò»Ð©ÓС°·Ã¿ÍÉÏÏÞ¡±µÄ¶ÔÏ󣬱ÈÈçÁ¬½Ó³Ø¡£

BoundedSemaphore ÓëSemaphoreµÄÎ¨Ò»Çø±ðÔÚÓÚǰÕß½«ÔÚµ÷ÓÃrelease()ʱ¼ì²é¼ÆÊýÆ÷µÄÖµÊÇ·ñ³¬¹ýÁ˼ÆÊýÆ÷µÄ³õʼֵ£¬Èç¹û³¬¹ýÁ˽«Å׳öÒ»¸öÒì³£¡£

¹¹Ôì·½·¨£º

Semaphore(value=1): valueÊǼÆÊýÆ÷µÄ³õʼֵ¡£

ʵÀý·½·¨£º

acquire([timeout]): ÇëÇóSemaphore¡£Èç¹û¼ÆÊýÆ÷Ϊ0£¬½«×èÈûÏß³ÌÖÁͬ²½×èÈû״̬£»·ñÔò½«¼ÆÊýÆ÷-1²¢Á¢¼´·µ»Ø¡£

release(): ÊÍ·ÅSemaphore£¬½«¼ÆÊýÆ÷+1£¬Èç¹ûʹÓÃBoundedSemaphore£¬»¹½«½øÐÐÊÍ·Å´ÎÊý¼ì²é¡£release()·½·¨²»¼ì²éÏß³ÌÊÇ·ñÒÑ»ñµÃ Semaphore¡£

# encoding: UTF-8
import threading
import time

# ¼ÆÊýÆ÷³õֵΪ2
semaphore = threading.Semaphore(2)

def func():

# ÇëÇóSemaphore£¬³É¹¦ºó¼ÆÊýÆ÷-1£»¼ÆÊýÆ÷Ϊ0ʱ×èÈû
print '%s acquire semaphore...' % threading.currentThread().getName()
if semaphore.acquire():

print '%s get semaphore' % threading.currentThread().getName()
time.sleep(4)

# ÊÍ·ÅSemaphore£¬¼ÆÊýÆ÷+1
print '%s release semaphore' % threading.currentThread().getName()
semaphore.release()

t1 = threading.Thread(target=func)
t2 = threading.Thread(target=func)
t3 = threading.Thread(target=func)
t4 = threading.Thread(target=func)
t1.start()
t2.start()
t3.start()
t4.start()

time.sleep(2)

# ûÓлñµÃsemaphoreµÄÖ÷Ïß³ÌÒ²¿ÉÒÔµ÷ÓÃrelease
# ÈôʹÓÃBoundedSemaphore£¬t4ÊÍ·Åsemaphoreʱ½«Å׳öÒì³£
print 'MainThread release semaphore without acquire'
semaphore.release()

3.6. Event

Event£¨Ê¼þ£©ÊÇ×î¼òµ¥µÄÏß³ÌͨÐÅ»úÖÆÖ®Ò»£ºÒ»¸öÏß³Ì֪ͨʼþ£¬ÆäËûÏ̵߳ȴýʼþ¡£EventÄÚÖÃÁËÒ»¸ö³õʼΪFalseµÄ±êÖ¾£¬µ±µ÷ÓÃset()ʱÉèΪTrue£¬µ÷ÓÃclear()Ê±ÖØÖÃΪ False¡£wait()½«×èÈûÏß³ÌÖÁµÈ´ý×èÈû״̬¡£

EventÆäʵ¾ÍÊÇÒ»¸ö¼ò»¯°æµÄ Condition¡£EventûÓÐËø£¬ÎÞ·¨Ê¹Ï߳̽øÈëͬ²½×èÈû״̬¡£

¹¹Ôì·½·¨£º

Event()

ʵÀý·½·¨£º

isSet(): µ±ÄÚÖñê־ΪTrueʱ·µ»ØTrue¡£

set(): ½«±êÖ¾ÉèΪTrue£¬²¢Í¨ÖªËùÓд¦Óڵȴý×èÈû״̬µÄÏָ̻߳´ÔËÐÐ״̬¡£

clear(): ½«±êÖ¾ÉèΪFalse¡£

wait([timeout]): Èç¹û±ê־ΪTrue½«Á¢¼´·µ»Ø£¬·ñÔò×èÈûÏß³ÌÖÁµÈ´ý×èÈû״̬£¬µÈ´ýÆäËûÏ̵߳÷ÓÃset()¡£

# encoding: UTF-8
import threading
import time

event = threading.Event()

def func():
# µÈ´ýʼþ£¬½øÈëµÈ´ý×èÈû״̬
print '%s wait for event...' % threading.currentThread().getName()
event.wait()

# ÊÕµ½Ê¼þºó½øÈëÔËÐÐ״̬
print '%s recv event.' % threading.currentThread().getName()

t1 = threading.Thread(target=func)
t2 = threading.Thread(target=func)
t1.start()
t2.start()

time.sleep(2)

# ·¢ËÍʼþ֪ͨ
print 'MainThread set event.'
event.set()

3.7. Timer

Timer£¨¶¨Ê±Æ÷£©ÊÇThreadµÄÅÉÉúÀ࣬ÓÃÓÚÔÚÖ¸¶¨Ê±¼äºóµ÷ÓÃÒ»¸ö·½·¨¡£

¹¹Ôì·½·¨£º

Timer(interval, function, args=[], kwargs={})

interval: Ö¸¶¨µÄʱ¼ä

function: ÒªÖ´Ðеķ½·¨

args/kwargs: ·½·¨µÄ²ÎÊý

ʵÀý·½·¨£º

Timer´ÓThreadÅÉÉú£¬Ã»ÓÐÔö¼ÓʵÀý·½·¨¡£

# encoding: UTF-8
import threading

def func():
print 'hello timer!'

timer = threading.Timer(5, func)
timer.start()

3.8. local

localÊÇÒ»¸öСд×Öĸ¿ªÍ·µÄÀ࣬ÓÃÓÚ¹ÜÀí thread-local£¨Ïֲ߳̾¿µÄ£©Êý¾Ý¡£¶ÔÓÚͬһ¸ölocal£¬Ïß³ÌÎÞ·¨·ÃÎÊÆäËûÏß³ÌÉèÖõÄÊôÐÔ£»Ïß³ÌÉèÖõÄÊôÐÔ²»»á±»ÆäËûÏß³ÌÉèÖõÄͬÃûÊôÐÔÌæ»»¡£

¿ÉÒÔ°Ñlocal¿´³ÉÊÇÒ»¸ö¡°Ïß³Ì-ÊôÐÔ×ֵ䡱µÄ×ֵ䣬local·â×°ÁË´Ó×ÔÉíʹÓÃÏß³Ì×÷Ϊ key¼ìË÷¶ÔÓ¦µÄÊôÐÔ×ֵ䡢ÔÙʹÓÃÊôÐÔÃû×÷Ϊkey¼ìË÷ÊôÐÔÖµµÄϸ½Ú¡£

# encoding: UTF-8
import threading

local = threading.local()
local.tname = 'main'

def func():
local.tname = 'notmain'
print local.tname

t1 = threading.Thread(target=func)
t1.start()
t1.join()

print local.tname

ÊìÁ·ÕÆÎÕThread¡¢Lock¡¢Condition¾Í¿ÉÒÔÓ¦¶Ô¾ø´ó¶àÊýÐèҪʹÓÃÏ̵߳ij¡ºÏ£¬Ä³Ð©Çé¿öÏÂlocalÒ²ÊǷdz£ÓÐÓõĶ«Î÷¡£±¾ÎĵÄ×îºóʹÓÃÕ⼸¸öÀàչʾÏ̻߳ù´¡ÖÐÌáµ½µÄ³¡¾°£º

# encoding: UTF-8
import threading

alist = None
condition = threading.Condition()

def doSet():
if condition.acquire():
while alist is None:
condition.wait()
for i in range(len(alist))[::-1]:
alist[i] = 1
condition.release()

def doPrint():
if condition.acquire():
while alist is None:
condition.wait()
for i in alist:
print i,
print
condition.release()

def doCreate():
global alist
if condition.acquire():
if alist is None:
alist = [0 for i in range(10)]
condition.notifyAll()
condition.release()

tset = threading.Thread(target=doSet,name='tset')
tprint = threading.Thread(target=doPrint,name='tprint')
tcreate = threading.Thread(target=doCreate,name='tcreate')
tset.start()
tprint.start()
tcreate.start()

È«ÎÄÍê

   
4238 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ