1. 程式人生 > >python之系統編程 --線程

python之系統編程 --線程

加鎖 如果 ima -i 沒有 %d div img ges

###########使用線程完成多任務################

from threading import Thread
import time

#1. 如果多個線程執行的都是同一個函數的話,各自之間不會有影響,各是個的
def test():
    print("----昨晚喝多了,下次少喝點---")
    time.sleep(1)


for i in range(5):
    t = Thread(target=test)
    t.start()

#############使用類的方式創建線程完成任務###########

import threading
import time class MyThread(threading.Thread): def run(self): for i in range(3): time.sleep(1) msg = "I‘m "+self.name+ @ +str(i) #name屬性中保存的是當前線程的名字 print(msg) if __name__ == __main__: t = MyThread() t.start()

執行結果:

[root@master process]#
python3 09-thread.py Im Thread-1 @ 0 Im Thread-1 @ 1 Im Thread-1 @ 2

###############線程之間共享全局變量#########

from threading import Thread
import time

#線程之間共享全局變量
g_num = 100

def work1():
    global g_num
    for i in range(3):
        g_num += 1

    print("----in work1, g_num is %d---"%g_num)


def
work2(): global g_num print("----in work2, g_num is %d---"%g_num) print("---線程創建之前g_num is %d---"%g_num) t1 = Thread(target=work1) t1.start() #延時一會,保證t1線程中的事情做完 time.sleep(1) t2 = Thread(target=work2) t2.start()

############線程之間共享全局變量帶來的問題############

from threading import Thread
import time

g_num = 0

def test1():
    global g_num
    for i in range(1000000):
        g_num += 1

    print("---test1---g_num=%d"%g_num)

def test2():
    global g_num
    for i in range(1000000):
        g_num += 1

    print("---test2---g_num=%d"%g_num)


p1 = Thread(target=test1)
p1.start()

#time.sleep(3) #取消屏蔽之後 再次運行程序,結果會不一樣,,,為啥呢?

p2 = Thread(target=test2)
p2.start()

print("---g_num=%d---"%g_num)

############把列表當做參數傳遞給線程############

from threading import Thread
import time

def work1(nums):
    nums.append(44)
    print("----in work1---",nums)


def work2(nums):
    #延時一會,保證t1線程中的事情做完
    time.sleep(1)
    print("----in work2---",nums)

g_nums = [11,22,33]

t1 = Thread(target=work1, args=(g_nums,))
t1.start()

t2 = Thread(target=work2, args=(g_nums,))
t2.start()

###############避免多線程對共享數據出錯的方式###########

from threading import Thread
import time

g_num = 0
g_flag = 1

def test1():
    global g_num
    global g_flag
    if g_flag == 1:
        for i in range(1000000):
            g_num += 1

        g_flag = 0

    print("---test1---g_num=%d"%g_num)

def test2():
    global g_num
    #輪詢
    while True:
        if g_flag != 1:
            for i in range(1000000):
                g_num += 1
            break

    print("---test2---g_num=%d"%g_num)


p1 = Thread(target=test1)
p1.start()

#time.sleep(3) #取消屏蔽之後 再次運行程序,結果會不一樣,,,為啥呢?

p2 = Thread(target=test2)
p2.start()

print("---g_num=%d---"%g_num)

##############使用互斥鎖解決共享數據出錯問題##################

技術分享

代碼例子:

from threading import Thread, Lock
import time

g_num = 0

def test1():
    global g_num
    #這個線程和test2線程都在搶著 對這個鎖 進行上鎖,如果有1方成功的上鎖,那麽導致另外
    #一方會堵塞(一直等待)到這個鎖被解開為止
    mutex.acquire()
    for i in range(1000000):
        g_num += 1
    mutex.release()#用來對mutex指向的這個鎖 進行解鎖,,,只要開了鎖,那麽接下來會讓所有因為
                    #這個鎖 被上了鎖 而堵塞的線程 進行搶著上鎖

    print("---test1---g_num=%d"%g_num)

def test2():
    global g_num
    mutex.acquire()
    for i in range(1000000):
        g_num += 1
    mutex.release()

    print("---test2---g_num=%d"%g_num)

#創建一把互斥鎖,這個鎖默認是沒有上鎖的
mutex = Lock()

p1 = Thread(target=test1)
p1.start()

#time.sleep(3) #取消屏蔽之後 再次運行程序,結果會不一樣,,,為啥呢?

p2 = Thread(target=test2)
p2.start()

print("---g_num=%d---"%g_num)

#############多線程使用非共享變量################

from threading import Thread
import threading
import time

def test1():
    #註意:
    #   1. 全局變量在多個線程中 共享,為了保證正確運行需要鎖
    #   2. 非全局變量在每個線程中 各有一份,不會共享,當然了不需要加鎖
    name = threading.current_thread().name
    print("----thread name is %s ----"%name)
    g_num = 100
    if name == "Thread-1": 
        g_num += 1
    else:
        time.sleep(2)
    print("--thread is %s----g_num=%d"%(name,g_num))

#def test2():
#    time.sleep(1)
#    g_num = 100
#    print("---test2---g_num=%d"%g_num)


p1 = Thread(target=test1)
p1.start()

p2 = Thread(target=test1)
p2.start()

執行結果:

技術分享

###################同步#################

python之系統編程 --線程