python多線程坑,python筆記05_多線程

 2023-10-20 阅读 28 评论 0

摘要:實例 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().nam

實例

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)  
t = threading.Thread(target=loop, name='LoopThread')  
t.start()  
t.join()  
print('thread %s ended.' % threading.current_thread().name)  

Lock
多進程中,同一個變量,各自有一份拷貝存在于每個進程中,互不影響,
多線程中,所有變量都由所有線程共享,所以,任何一個變量都可以被任何一個線程修改,因此,線程之間共享數據最大的危險在于多個線程同時改一個變量,把內容給改亂了。
代碼

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

當多個線程同時執行lock.acquire()時,只有一個線程能成功地獲取鎖,然后繼續執行代碼,其他線程就繼續等待直到獲得鎖為止。
獲得鎖的線程用完后一定要釋放鎖,否則那些苦苦等待鎖的線程將永遠等待下去,成為死線程。所以我們用try...finally來確保鎖一定會

GIL鎖
Python的線程雖然是真正的線程,但解釋器執行代碼時,有一個GIL鎖:Global Interpreter Lock,任何Python線程執行前,必須先獲得GIL鎖,然后,每執行100條字節碼,解釋器就自動釋放GIL鎖,讓別的線程有機會執行。這個GIL全局鎖實際上把所有線程的執行代碼都給上了鎖,所以,多線程在Python中只能交替執行,即使100個線程跑在100核CPU上,也只能用到1個核。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/150748.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息