python學習筆記 第8天

2021-08-28 03:09:50 字數 3165 閱讀 7468

繼續今天的python學習

昨天我們說到了多執行緒共享資料(全域性變數),那麼今天我們就緊接著來說一下多執行緒不共享資料的使用方式

import threading

import time

def test1():

the_number = 0

for i in range(100):

the_number += 1

time.sleep(1)

print(threading.current_thread().name + "the_number = %d"%(the_number))

def test2():

the_number = 0;

for i in range(200):

the_number += 1

time.sleep(2)

print(threading.current_thread().name + "the_number = %d"%(the_number))

t1 = threading.thread(target=test1)

t2 = threading.thread(target=test2)

t1.start()

t2.start()

執行結果:

thread-1the_number = 100

thread-2the_number = 200

可以看到兩個執行緒之間是互不影響的。

然後提到了乙個死鎖的問題,看如下**:

import threading

class thread1(threading.thread):

def run(self):

if mutexa.acquire():

print("mutexa doing in 1")

if mutexb.acquire():

print("mutexb doing in 1")

mutexb.release()

mutexa.release()

class thread2(threading.thread):

def run(self):

if mutexb.acquire():

print("mutexb doing in 2")

if mutexa.acquire():

print("mutexa doing in 2")

mutexa.release()

mutexb.release()

mutexa = threading.lock()

mutexb = threading.lock()

if __name__ == "__main__":

t1 = thread1()

t2 = thread2()

t1.start()

t2.start()

執行結果:

第一種:

mutexa doing in 1

mutexb doing in 1

mutexb doing in 2

mutexa doing in 2

-------------------

第二種:

mutexa doing in 1

mutexb doing in 2

第一種並沒有被鎖死,那麼原因是什麼呢?

第二種就是出現死鎖的情況了,然後程式一直會卡在這裡,這樣很危險,也會造成相當大的損失,所以在寫程式的時候一定要避免死鎖!!!

如何避免死鎖的,課上提到了一種銀行家演算法,由於課上沒有實現,今天暫且不談,後續我會更新這個演算法的細節。

接下來談到的是乙個非同步的問題,首先,什麼是非同步呢,就是沒有規定的不掉,程式誰先執行不一定,那麼同步就是按照規定好的順序去執行**:

import threading

import time

def work1():

while true:

if lock1.acquire():

print("----1----")

lock2.release()

def work2():

while true:

if lock2.acquire():

print("----2----")

lock3.release()

def work3():

while true:

if lock3.acquire():

print("----3----")

time.sleep(1)

lock1.release()

lock1 = threading.lock()

lock2 = threading.lock()

lock2.acquire()

lock3 = threading.lock()

lock3.acquire()

t1 = threading.thread(target=work1)

t2 = threading.thread(target=work2)

t3 = threading.thread(target=work3)

t1.start()

t2.start()

t3.start()

執行結果:

----1----

----2----

----3----

----1----

----2----

----3----

----1----

----2----

----3----

----1----

----2----

----3----

----1----

----2----

----3----

可以看出來是按1,2,3的先後順序來執行的,這就是同步

接著是耦合的問題,什麼是耦合?老師課上舉了乙個例子,乙個人做包子,乙個人吃包子,吃包子的速度可能與做包子的速度不相同,那麼這樣就會產生一些問題,那麼在程式中也一樣,再執行爬蟲時爬資料的速度和處理資料的速度不匹配會導致一些時間唄浪費,那麼為了解決這樣的問題,我們用到了queue模組中的queue(佇列)。

學習Python第8天

物件是類的例項。換句話說,類主要定義物件的結構,然後我們以類為模板建立物件。類不但包含方法定義,而且還包含所有例項共享的資料。在 python 中定義私有變數只需要在變數名或函式名前加上 兩個下劃線,那麼這個函式或變數就會為私有的了。class derivedclassname baseclassn...

學習python的第8天

10.4儲存資料 模組json 模組json讓你能夠將簡單的python資料結構轉儲到檔案中,並在程式再次執行時載入該檔案中的資料。json.dump 儲存資料,json.dump 要儲存的資料,用於儲存資料的檔案 import json 匯出json模組 numbers 2,3,5,7,11,13...

python入門學習(第8天)

物件 屬性 方法 物件是類的例項。換句話說,類主要定義物件的結構,然後我們以類為模板建立物件。類不但包含方法定義,而且還包含所有例項共享的資料。例子 class turtle python中的類名約定以大寫字母開頭 關於類的乙個簡單例子 屬性 color green weight 10 legs 4...