์ค๋ ๋์ ๊ฐ๋ ๊ณผ ํ์ด์ฌ์์ ์ค๋ ๋ ์ฌ์ฉ๋ฐ ๋ฌธ์ ์ ์ ๋ํด ์์๋ณด์
์ค๋ ๋(thread)๋ ์ด๋ ํ ํ๋ก๊ทธ๋จ ๋ด์์, ํนํ ํ๋ก์ธ์ค ๋ด์์ ์คํ๋๋ ํ๋ฆ์ ๋จ์๋ฅผ ๋งํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ ํ๋ก๊ทธ๋จ์ ํ๋์ ์ค๋ ๋๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง, ํ๋ก๊ทธ๋จ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ ์ด์์ ์ค๋ ๋๋ฅผ ๋์์ ์คํํ ์ ์๋ค. ์ด๋ฌํ ์คํ ๋ฐฉ์์ ๋ฉํฐ์ค๋ ๋(multithread)๋ผ๊ณ ํ๋ค.
import time
if __name__ == "__main__":
increased_num = 0
start_time = time.time()
for i in range(100000000):
increased_num += 1
print("--- %s seconds ---" % (time.time() - start_time))
print("increased_num=",end=""), print(increased_num)
print("end of main")
--- 8.507359981536865 seconds ---
increased_num=100000000
end of main
import threading
import time
shared_number = 0
def thread_1(number):
global shared_number
print("number = ",end=""), print(number)
for i in range(number):
shared_number += 1
def thread_2(number):
global shared_number
print("number = ",end=""), print(number)
for i in range(number):
shared_number += 1
if __name__ == "__main__":
threads = [ ]
start_time = time.time()
t1 = threading.Thread( target= thread_1, args=(50000000,) )
t1.start()
threads.append(t1)
t2 = threading.Thread( target= thread_2, args=(50000000,) )
t2.start()
threads.append(t2)
for t in threads:
t.join()
print("--- %s seconds ---" % (time.time() - start_time))
print("shared_number=",end=""), print(shared_number)
print("end of main")
number = 50000000
number = 50000000
--- 7.301347017288208 seconds ---
shared_number=65657956
end of main
number = 50000000
number = 50000000
--- 7.301347017288208 seconds ---
shared_number=65657956 ------>>>>>????????
end of main
shared-number
๊ฐ 1์ต์ด ์๋๋ผ 6500๋ง ๋ฐ์ ์๋๋ค๋๊ฒ์ด๋ค!shared_number
๋ฅผ ์ค๋ ๋๋ค๋ผ๋ฆฌ ๊ณต์ ํ๋ค ๊ทธ๋์ ์ซ์๊ฐ 1์ต๊น์ง ์ ๊ฐ๊ณ 6500๋ง๊น์ง๋ง ์ฌ๋ฅธ๋ค. ์ ๊ทธ๋ฆผ ์ฒ๋ผ ์ค๋ ๋1์ด ๋ง์ ๋ง ํ๊ณ Contexting Switching์ด ์ผ์ด๋๋ฉด ์ค๋ ๋2 ์์ shared_number๊ฐ ์ 0์ด ๊ตฌ๋ ํ๊ณ ์ฝ๊ณ ๋ง์ ์ํ๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ์ ํ๋ ค๊ณ ํ๋๋ฐ ๋ Contexting Switching์ด ์ผ์ด๋๋ฉด???
๊ทธ๋ ๋ค! ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ค๋ ๋2์์ ์ค๋ ๋1๋ก ์ปจํ ์คํธ ์ค์์นญ์ ํ๋ฉด์ ์ค๋ ๋ 1์ ์๊น ์ผํ ์คํธ ์ค์์นญ ๋๊ธฐ์ ์ ๋ ์ง์คํฐ๊ฐ1์์ฐธ๊ณ ํด์ ๋ณ์(shared_number)1์ ์ ์ฅํ๊ณ ๋ค์ ์ค๋ ๋2๋ก ์ผํ ์คํธ ์ค์์นญํ๋ฉด ์ค๋ ๋2๋ ์ง์ ์ ๋ ์ง์คํฐ๊ฐ1์ ์ฐธ์กฐํด์ ๋ณ์(shared_number)์ 1์ ์ ์ฅํ๋ค
์์ ์์๋ 5์ฒ๋ง์ ๋ฐ๋ณตํ์ง๋ง ์ซ์๋ฅผ 5๋ง์ผ๋ก ์ค์ด๋ฉด 10๋ง์ด ๋๋ค
number = 50000
number = 50000
--- 0.009940862655639648 seconds ---
shared_number=100000
๋ฎคํ
์ค๋ Lock์ ๊ฐ์ ๊ธฐ์ ๋ก ์๊ณ์์ญ์ ๊ฐ์ง ์ค๋ ๋๋ค์ ์คํ ์๊ฐ์ด ์๋ก ๊ฒน์น์ง ์๊ฒ ๊ฐ๊ฐ ๋จ๋
์ผ๋ก ์คํ๋๊ฒ ํ๋ ๊ธฐ์ ์
๋๋ค. ๋ํ ๊ณต์ ๋ฆฌ์์ค์ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผ ํ ์ ์๋๋ก ํ๋ ์ํธ ๋ฐฐ์ ๋์์ฑ ์ ์ด ์ ์ฑ
์ ๊ฐ์ ํ๊ธฐ ์ํด ์ค๊ณ ๋์์ต๋๋ค.
์ถ์ฒ
for i in range(number):
shared_number += 1
lock.acquire()
for i in range(number):
shared_number += 1
lock.release()
lock.acquire() ํจ์๋ ์๊ณ์์ญ(๋ฐ๋ณต๋ฌธ)์ ํ๋์ ์ค๋ ๋๊ฐ ๋ค์ด๊ฐ๋ฉด ํ ์ ๊ฐ๋ฒ๋ ค์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ค์ด์ค์ง๋ฅผ ๋ชปํ๋ค.
์ค๋ ๋1๋ฒ์ ์๊ณ์์ญ(๋ฐ๋ณต๋ฌธ)์ด ๋๋๋ฉด ์ค๋ ๋ 2๋ฒ์ ๋ฐ๋ณต๋ฌธ์ด ์์๋๊ณ ๋๋๋ค.
์ต์ข ์์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
import threading
import time
shared_number = 0
lock = threading.Lock()
def thread_1(number):
global shared_number
print("number = ",end=""), print(number)
lock.acquire()
print("1๋ฒ ์์")
for i in range(number):
shared_number += 1
print(shared_number)
print("1๋ฒ ๋")
lock.release()
def thread_2(number):
global shared_number
print("number = ",end=""), print(number)
lock.acquire()
print("2๋ฒ ์์")
for i in range(number):
shared_number += 1
print("2๋ฒ ๋")
lock.release()
if __name__ == "__main__":
threads = [ ]
start_time = time.time()
t1 = threading.Thread( target= thread_1, args=(50000000,) )
t1.start()
threads.append(t1)
t2 = threading.Thread( target= thread_2, args=(50000000,) )
t2.start()
threads.append(t2)
for t in threads:
t.join()
print("--- %s seconds ---" % (time.time() - start_time))
print("shared_number=",end=""), print(shared_number)
print("end of main")
number = 50000000
number = 50000000
1๋ฒ ์์
1๋ฒ ๋
2๋ฒ ์์
2๋ฒ ๋
--- 7.250640869140625 seconds ---
shared_number=100000000
end of main