1. 程式人生 > >python基礎16

python基礎16

1.執行緒的開啟

import time, threading

新執行緒執行的程式碼:

def loop():
  print('thread %s is running...' % threading.current_thread().name)
 n = 0
  while n < 5:
	    n = n + 1
 	   print('thread %s >>> %s' % (threading.current_thread().name, n))
	    time.sleep(1)
	print('thread %s ended.' % threading.current_thread().name)

print('thread %s is running...' % threading.current_thread().name)

#通過使用threading.Thread()方法進行開啟執行緒。

t = threading.Thread(target=loop, name='LoopThread')
t.start()
t.join()
print('thread %s ended.' % threading.current_thread().name)

2.執行緒鎖的使用

balance = 0
#使用threading.Lock()進行執行緒順序控制
lock = threading.Lock()

def run_thread(n):
  for i in range(100000):
     # 先要獲取鎖:
	    lock.acquire()
 	   try:
   	     # 放心地改吧:
   	     change_it(n)
	    finally:
  	      # 改完了一定要釋放鎖:
   	     lock.release()

3.多核的使用
因為Python的執行緒雖然是真正的執行緒,但直譯器執行程式碼時,有一個GIL鎖:Global Interpreter Lock,任何Python執行緒執行前,必須先獲得GIL鎖,然後,每執行100條位元組碼,直譯器就自動釋放GIL鎖,讓別的執行緒有機會執行。這個GIL全域性鎖實際上把所有執行緒的執行程式碼都給上了鎖,所以,多執行緒在Python中只能交替執行,即使100個執行緒跑在100核CPU上,也只能用到1個核。

GIL是Python直譯器設計的歷史遺留問題,通常我們用的直譯器是官方實現的CPython,要真正利用多核,除非重寫一個不帶GIL的直譯器。

所以,在Python中,可以使用多執行緒,但不要指望能有效利用多核。如果一定要通過多執行緒利用多核,那隻能通過C擴充套件來實現,不過這樣就失去了Python簡單易用的特點。

不過,也不用過於擔心,Python雖然不能利用多執行緒實現多核任務,但可以通過多程序實現多核任務。多個Python程序有各自獨立的GIL鎖,互不影響。