-
Notifications
You must be signed in to change notification settings - Fork 0
/
example_threading.py
86 lines (65 loc) · 1.76 KB
/
example_threading.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
"""
Threading practice
"""
import threading
import time
def foo(number: int):
# create lock instance
# 針對 multi thread,每個 thread 在同時進行時,如果針對某些不能同時操作的事情時 e.g database寫入、寫入同一個檔案
# 則需要加入 lock來確保每次只有一個 thread 在操作,而不是多個 thread同時操作
lock = threading.Lock()
# acquire lock control
lock.acquire()
# logic
for i in range(number):
print(i)
print("finished foo() logic")
# release lock control
lock.release()
"""
regular
"""
sample_thread = threading.Thread(target=foo, args=10)
# run threading
sample_thread.start()
# wait thread until end
# 主要針對某些需要等待 thread 跑完才能執行的邏輯
sample_thread.join()
# after thread finished, continous run later logic
print("Done.")
"""
multi threading
"""
threads = []
for i in range(5):
threads.append(threading.Thread(target=foo, args=10))
threads[i].start()
for i in range(5):
threads[i].join()
# after thread finished, continous run later logic
print("Done.")
"""
threading pool
"""
import current.futures as cf
with cf.ThreadPoolExecutor(max_workers=2) as executor:
func_map = {executor.submit(foo(i)): i for i in range(1, 4)}
for future in cf.as_completed(func_map):
print(future.result())
"""
defined custom Thread class
"""
class Worker(threading.Thread):
def __init__(self, tag: int):
threading.Thread.__init__(self)
self.tag = tag
def run(self):
print(f"Worker # {self.tag} is running.")
foo(self.tag)
time.sleep(1)
for i in range(3):
worker = Worker(i)
worker.start()
worker.join()
# after thread finished, continous run later logic
print("Done.")