程序與執行緒的區別:
程序——應用程式的執行例項,每乙個執行中的程式就是乙個程序
執行緒——程序的組成部分,乙個程序可以擁有多個執行緒;在多執行緒中,會有乙個主線程來完成整個程序從開始到結束的全部操作,而其他的執行緒會在主線程的執行過程中被建立或退出。
python景區賣票系統(多執行緒的應用)
import threading
import time
lock=threading.lock()
num=100
#賣票def sell(name):
#lock.acquire()
global num
if num>0:
num=num-1
print("視窗%s賣出一張票,剩餘%d張票" % (name,num))
time.sleep(5)
else:
print("票已經賣完")
#lock.release()
while 1==1:
if num>0:
a1 = threading.thread(target=sell, args=["1", ])
a2 = threading.thread(target=sell, args=["2", ])
a3 = threading.thread(target=sell, args=["3", ])
a1.start()
a2.start()
a3.start()
else:
break
簡介
python3 通過兩個標準庫 _thread (相當於python2的thread模組)和 threading 提供對執行緒的支援。
_thread 提供了低階別的、原始的執行緒以及乙個簡單的鎖,它相比於 threading 模組的功能還是比較有限的。
threading 模組除了包含 _thread 模組中的所有方法外,還提供的其他方法:
除了使用方法外,執行緒模組同樣提供了thread類來處理執行緒,thread類提供了以下方法:
1.python建立執行緒
ython中使用執行緒有兩種方式:函式或者用類來包裝執行緒物件
1.1使用 threading 模組建立執行緒
通過直接從 threading.thread 繼承建立乙個新的子類,並例項化後呼叫 start() 方法啟動新執行緒,即它呼叫了執行緒的 run() 方法:
import threading
import time
exitflag = 0
class mythread (threading.thread):
def __init__(self, threadid, name, counter):
threading.thread.__init__(self)
self.threadid = threadid
self.name = name
self.counter = counter
def run(self):
print ("開始執行緒:" + self.name)
print_time(self.name, self.counter, 5)
print ("退出執行緒:" + self.name)
def print_time(threadname, delay, counter):
while counter:
if exitflag:
threadname.exit()
time.sleep(delay)
print ("%s: %s" % (threadname, time.ctime(time.time())))
counter -= 1
# 建立新執行緒
thread1 = mythread(1, "thread-1", 1)
thread2 = mythread(2, "thread-2", 2)
# 開啟新執行緒
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print ("退出主線程")
1.2函式建立
首先定義乙個函式,然後通過threading.thread(function, args[, kwargs])建立執行緒,呼叫 start() 方法啟動執行緒
引數說明:
import threading
import time
# 為執行緒定義乙個函式
def print_time( threadname, delay):
count = 0
while count < 5:
time.sleep(delay)
count += 1
print ("%s: %s" % ( threadname, time.ctime(time.time()) ))
# 建立兩個執行緒,引數可是是字典,陣列,或列表
a1=threading.thread( target=print_time, args=["thread-1", 2, ]) # 建立threading.thread類
a2=threading.thread(target=print_time, args=["thread-2",4])
a1.start() # 呼叫threading.thread類中的start()方法啟動執行緒
a2.start()
2.python執行緒同步
使用 thread 物件的 lock 和 rlock 可以實現簡單的執行緒同步,這兩個物件都有 acquire 方法和 release 方法,對於那些需要每次只允許乙個執行緒操作的資料,可以將其操作放到 acquire 和 release 方法之間。
鎖有兩種狀態——鎖定和未鎖定。每當乙個執行緒比如"set"要訪問共享資料時,必須先獲得鎖定;如果已經有別的執行緒比如"print"獲得鎖定了,那麼就讓執行緒"set"暫停,也就是同步阻塞;等到執行緒"print"訪問完畢,釋放鎖以後,再讓執行緒"set"繼續。
import threading
import time
class mythread (threading.thread):
def __init__(self, threadid, name, counter):
threading.thread.__init__(self)
self.threadid = threadid
self.name = name
self.counter = counter
def run(self):
print ("開啟執行緒: " + self.name)
# 獲取鎖,用於執行緒同步
threadlock.acquire()
print_time(self.name, self.counter, 3)
# 釋放鎖,開啟下乙個執行緒
threadlock.release()
def print_time(threadname, delay, counter):
while counter:
time.sleep(delay)
print ("%s: %s" % (threadname, time.ctime(time.time())))
counter -= 1
threadlock = threading.lock()
threads =
# 建立新執行緒
thread1 = mythread(1, "thread-1", 1)
thread2 = mythread(2, "thread-2", 2)
# 開啟新執行緒
thread1.start()
thread2.start()
# 新增執行緒到執行緒列表
# 等待所有執行緒完成
for t in threads:
t.join()
print ("退出主線程")
Python 多執行緒與多程序
前言 以前玩單機或者玩小資料集,都基本不用多執行緒或多程序都能基本滿足需求了 所以沒怎麼了解這方面的東西。但現在玩幾百萬甚至上千萬的資料,甚至集群等東西之後,就有必要學習多執行緒或多程序了。在python中首先要匯入相關的模組 import threading as td import multip...
Python多執行緒與多程序
python多執行緒與多程序 程序 process 和執行緒 thread 是非常抽象的概念,也是程式設計師必需掌握的核心知識!多程序和多執行緒程式設計對於 的併發執行,提公升 效率和縮短執行時間至關重要。程序 process 和執行緒 thread 程序是作業系統分配資源的最小單元 執行緒是作業系...
python 多程序與多執行緒
由於python gil的存在,讓python 多執行緒很雞肋,很多時候如果有併發的需求,則選擇多程序來實現,但是多程序是很消耗資源的,而且程序之間不能資源共享,而且還會受到機器cpu核心數目的限制,因此在特定場景下針對不同需求會有一些取捨。傳聞對於io密集性的操作,比如,處理多個http 的請求,...