python 多執行緒與多程序

2021-09-10 06:24:44 字數 4070 閱讀 4222

程序與執行緒的區別:

程序——應用程式的執行例項,每乙個執行中的程式就是乙個程序

執行緒——程序的組成部分,乙個程序可以擁有多個執行緒;在多執行緒中,會有乙個主線程來完成整個程序從開始到結束的全部操作,而其他的執行緒會在主線程的執行過程中被建立或退出。

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 的請求,...