๐ ืื ืื ืืขืฆื GIL?
ืึพGIL (Global Interpreter Lock) ืืื ืื ืื ืื ืคื ืืื ืืืคืจืฉ ืฉื ืคืืืชืื (ืืืจืกืช CPython), ืฉืืืืื ืฉ ืจืง ืฉืจืฉืืจ ืืื ืืจืืฅ ืงืื ืคืืืชืื ืืื ืจืืข ื ืชืื โ ืื ืื ืืฉ ืื ืืื ืืืืืช ืืขืื ืคื ืืืืช.
ืื, ืืคืืื ืื ืืฆืจืช 10 ืฉืจืฉืืจืื โ ืจืง ืืื ืืื ืืจืืฅ ืงืื ืคืืืชืื ืืืื ื ืชืื.
๐งช ืืื ืื ืงืืื?
ืืื ืขืื ืืื ืงืืื ืืื ืืคืฉื ืืช ื ืืืื ืืืืืจืื ืืคืืืชืื, ืฉืืชืืกืก ืขื ืื ืื ืื ืฉื ืกืคืืจืช ืืคื ืืืช (Reference Counting). ืืื GIL, ืืืื ื ืฆืจืืืื ืืืคื ืืืจืื ืชืงืืืช ืชืืจืืช (Race Conditions) ืื ืืืื ืืืืจืื, ืืื ืืื ืืืคื ืืช CPython ืืืกืืื ืืืชืจ ืืืฉืืฃ ืืืขืืืช.
๐ข ืืื GIL ืืฉืคืืข ืขื ืืืืฆืืขืื?
๐ป ืงืื ืฉืืืฆืข ืืืฉืืืื:
ืื ืืชื ืืจืืฅ ืงืื ืฉืืืื ืืืฉืืืื ืืชืืืืื, ืืืืืืช, ื ืืชืื ื ืชืื ืื โ ืชืจืื ืฉึพืฉืืืืฉ ืืฉืจืฉืืจืื ืื ื ืืชื ืฉืืคืืจ ืืืืชื ืืืืฆืืขืื. ืืคืขืืื ืืคืืื ืืืื ืืืื ืืืชืจ.
from threading import Thread
from time import perf_counter
def cpu_task():
print('ืืชืืืืื ืืืฉืื ืืื...')
total = 0
for i in range(10**7):
total += i
print('ืกืืืื ื ืืืฉืื.')
start = perf_counter()
threads = [Thread(target=cpu_task) for _ in range(4)]
for t in threads:
t.start()
for t in threads:
t.join()
end = perf_counter()
print(f'ืกื"ื ืืื: {end - start:.2f} ืฉื ืืืช')
ืืชืืฆืื? ืืขืจื ืืื ืื ืืืืช ืืจืืฅ ืืช ืืคืื ืงืฆืื ืืจืฆืฃ 4 ืคืขืืื. ืื ืืืืช ืืงืืืื.
๐ ืงืื ืืืืกืก ืงืื/ืคืื:
ืืื GIL ืื ืืคืจืืข ืื ืืจืืข ืฉืฉืจืฉืืจ ืืืื (ืืืฉื ืืงืจืืื ืืงืืืฅ ืื ืจืฉืช), ืืื "ืืฉืืจืจ" ืืช ืึพGIL ืืืืคืฉืจ ืืฉืจืฉืืจ ืืืจ ืืจืืฅ. ืืื ืืืงืจืื ืฉื ืขืืืื ืขื API, ืืกื ื ืชืื ืื, ืงืืฆืื ืืื' โ threading ืขืืืจ.
๐ ืคืชืจืื ืืช โ ืืื ืื ืืจืืฆืื ืงืื ืืงืืืื "ืืืืชื"?
๐งฉ 1. ืฉืืืืฉ ืึพmultiprocessing
ืืืืืื multiprocessing
ืืืฆืจ ืชืืืืืื ื ืคืจืืื, ืืื ืฉืจืฉืืจืื โ ืืืื ืื ืชืืืื ืืงืื GIL ืืฉืื.
from multiprocessing import Process
def cpu_task():
total = 0
for i in range(10**7):
total += i
processes = [Process(target=cpu_task) for _ in range(4)]
for p in processes:
p.start()
for p in processes:
p.join()
โ ืชืืฆืืืช: ืืจืื ืืืชืจ ืืืืจ ืืฉืืืืืจ ืขื ืืืฉืืืื ืืืืื. ืื ืชืืืื ืจืฅ ืขื ืืืื ืืฉืื.
โ๏ธ 2. ืฉืืืืฉ ืึพasyncio
ืืฉืืฉ ืืจืื ืคืขืืืืช ืงืื/ืคืื โ ืืคืฉืจ ืื ืืืฉืชืืฉ ืึพasyncio
, ืฉืืื ืคืชืจืื ืืืืกืก ืืืืืช ืืืจืืขืื. ืื ืื "ืืงืืืื ืืืืชื" ืืื ืืืื ืืขืื ืืืกืืื ื ืืืฉืืืื.
import asyncio
async def fetch_data():
print("ืืชืืืืื ืงืจืืื ืืฉืจืช...")
await asyncio.sleep(1)
print("ืงืืืื ื ืชืืืื.")
async def main():
await asyncio.gather(*(fetch_data() for _ in range(5)))
asyncio.run(main())
๐งญ ืืกืืืื
ืกืื ืืฉืืื | ืคืชืจืื ืืืขืืฃ |
---|---|
ืืืฉืืืื ืืืืื | multiprocessing |
ืงืื/ืคืื (I/O) | threading / asyncio |
ืขืืืื ืขื APIs | asyncio ืื threading |
ืจืืืื ืงืืฆืื | threading |