僅用學習參考
#coding=utf-8
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()
執行如下:
[root@server01 many_task]# python test5.py
---執行緒建立之前g_num is 100---
----in work1, g_num is 103---
----in work2, g_num is 103---
[root@server01 many_task]#
#coding=utf-8
from threading import thread
import time
def work1(nums):
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()
執行如下:
[root@server01 many_task]# python test6.py
('----in work1---', [11, 22, 33, 44])
('----in work2---', [11, 22, 33, 44])
總結:在乙個程序內的所有執行緒共享全域性變數,很方便在多個執行緒間共享資料缺點就是,執行緒是對全域性變數隨意遂改可能造成多執行緒之間對全域性變數的混亂(即執行緒非安全)
多執行緒開發可能遇到的問題
但是由於是多執行緒同時操作,有可能出現下面情況:
編寫**測試如下:
[root@server01 many_task]# vim test4.py
#coding=utf-8
import threading
from time import sleep,ctime
# 初始化g_num
g_num = 0
def add_func1(num):
global g_num
for i in range(num):
g_num += 1
print("add_func1,第%d次,g_num等於%d" % (i,g_num))
#sleep(0.5)
def add_func2(num):
global g_num
for i in range(num):
g_num += 1
print("add_func2,第%d次,g_num等於%d" % (i,g_num))
#sleep(0.5)
def main():
# 執行執行緒
t1 = threading.thread(target=add_func1,args=(100,))
t2 = threading.thread(target=add_func2,args=(100,))
t1.start()
t2.start()
# 判斷當執行緒存在,則等待1秒
while len(threading.enumerate()) > 1:
sleep(1)
print("2個執行緒對同乙個全域性變數操作之後的最終結果是:%s" % g_num)
if __name__ == '__main__':
main()
執行如下:
add_func2,第96次,g_num等於197
add_func2,第97次,g_num等於198
add_func2,第98次,g_num等於199
add_func2,第99次,g_num等於200
2個執行緒對同乙個全域性變數操作之後的最終結果是:200
[root@server01 many_task]#
兩個執行緒雖然執行很快,但是g_num恰好就是100+100=200的結果,是正確的。不過,這個數量少,可能看不出問題來。
測試示例2
[root@server01 many_task]# vim test7.py
def work1(num):
global g_num
for i in range(num):
g_num += 1
print("----in work1, g_num is %d---"%g_num)
def work2(num):
global g_num
for i in range(num):
g_num += 1
print("----in work2, g_num is %d---"%g_num)
print("---執行緒建立之前g_num is %d---"%g_num)
t1 = threading.thread(target=work1, args=(10000000,))
t1.start()
t2 = threading.thread(target=work2, args=(10000000,))
t2.start()
while len(threading.enumerate()) != 1:
time.sleep(1)
print("2個執行緒對同乙個全域性變數操作之後的最終結果是:%s" % g_num)
執行如下:
[root@server01 many_task]# python test7.py
---執行緒建立之前g_num is 0---
----in work1, g_num is 11977799---
----in work2, g_num is 19108796---
2個執行緒對同乙個全域性變數操作之後的最終結果是:19108796
[root@server01 many_task]#
正確的結果應該是:20000000
結論如果多個執行緒同時對同乙個全域性變數操作,會出現資源競爭問題,從而資料結果會不正確多執行緒共享變數 多執行緒共享全域性變數
1.多執行緒的執行順序是無序的 像2個人賽跑,乙個先跑乙個後跑,但根據每個人跑的速度不一樣,跑一半,二者可能跑在一起去了。2.又因為多執行緒是共享乙個全域性變數的,就導致資料容易被弄髒 假如老闆讓兩個員工寫兩個主題ppt,若這兩個人沒商量好,都做了同乙個主題的ppt,導致不但速度很慢,且這個ppt有...
多執行緒共享變數
題目如下 設計4個執行緒,其中兩個執行緒每次對j增加1,另外兩個執行緒對j每次減少1。如果每個執行緒執行的 相同 可以使用同乙個runnable物件,這樣在不同的執行緒中只需要把這個runnable物件傳到裡面去即可,因為runnable物件的run方法天熱原子性,不可能run方法被打斷,乙個run...
多執行緒共享變數
from threading import thread,lock global num 0 def func1 global global num 全域性變數 for i in range 1000000 lock.acquire 兩個執行緒會最開始搶這個鎖,拿到鎖就會處於關鎖,執行後面的程式,其...