### #threading:
a flow of execution,each thread takes a turn running to achieve concurrency.
#concurrency:並發性:把一個工作拆分成數個子任務,由不同thread共同完成。
#parallelism:並行性:每個單位獨立完成各自的任務,不相干擾
==========================
用法:
Thread_Name=threading.Thread(target=,arg=()) #arg=()為原func的parameters,tuple
Thread_Name.start()執行此線程
Thread_Name.join() 等待其他線程完成後,才繼續往後執行
==========================
#limitations:
1.CPU bound:task spends most of its time waiting "internal" events(e.g:CPU interprets),have better using "multiprocessing"
2.IO bound:task spends most of its time waiting "external events"(e.g:user inputs,web surfing),have better using "multithreading"
```python
import threading
import time
print(threading.active_count())
print(threading.enumerate())
def Eat_Breakfast():
time.sleep(3)
print("ate breakfast")
def Drink_Coffee():
time.sleep(5)
print("drank coffee")
def study():
time.sleep(6)
print("stdied")
x=threading.Thread(target=Eat_Breakfast,args=()) #args(),如果func 有parameters 可以放入tuple
y=threading.Thread(target=Drink_Coffee,args=())
z=threading.Thread(target=study,args=())
x.start()
y.start()
z.start()
x.join()
y.join()
z.join()
print(threading.active_count()) #現在的thread數量
# Eat_Breakfast()
# Drink_Coffee()
# study()
```
### daemon thread:常駐程式
在使用multiple threads時,其他thread會獨立於main thread進行分工,而main thread的工作完成時,其他thread(non-demon thread)則會在背後繼續運行,如想在main thread完成後讓背後thread也停止運行,就要使用daemon thread的形式。
用法:
Thread_Name=threading.Thread(target=func_Name,daemon=true)
Thread_Name.start()
Thread_Name.setdaemon(True/False) #daemon on/off
```python
import threading
import time
def timer():
ini_time=1
while True:
print("time=",ini_time)
time.sleep(1)
ini_time+=1
thread_1=threading.Thread(target=timer,args=(),daemon=True)
thread_1.start()
name=input("What's your name?")
#daemon:在輸入之後,timer也會停止計時,反之如果為一般thread,輸入之後仍會一直計時。
#此段要在.py中執行!!!!! C:\Users\a2147\OneDrive\桌面\python\learning python\#thread.py
```
### multiprocessing:多程序
多個任務利用cpu的多核心"並行",for CPU bound tasks (CPU used heavily)
用法:
Process_Name=Process(target=Name,args=())
```python
from multiprocessing import Process,cpu_count
import time
def counter(num):
ini=0
while ini<num:
ini+=1
def main():
t0=time.perf_counter()
a=Process(target=counter,args=(25000000,))
b=Process(target=counter,args=(25000000,))
c=Process(target=counter,args=(25000000,))
a.start()
b.start()
c.start()
a.join()
b.join()
c.join()
t1=time.perf_counter()
print("spend_time",t1-t0)
if __name__=="__main__":
main()
print(cpu_count())
#要在終端機上執行!!! #C:\Users\a2147\OneDrive\桌面\python\learning python\multiple process.py
#如果process數量超過核心數目,反而會增加工作時間。
```