python3スレッド
データの大きな山は、計算時間を節約することができ、マルチスレッドの効率的な利用を促進し、処理します。
マルチスレッドの基礎
- threading.active_count()現在アクティブなスレッドの数
threading.enumerate()は、現在実行中のマルチスレッドを列挙する
threading.current_thread()現在のプロセスが実行されているスレッド
基本的な使い方
target : 指定 这个线程去哪个函数里面去执行代码
args: 指定将来调用 函数的时候 传递什么数据过去
args参数指定的一定是一个元组类型
name属性是命名多线程的名字
start()是开始执行多线程
join()是线程结束后再执行后来的语句才会用到
サンプルコード:
thread = threading.Thread(target=thread_job,)
thread.start()
thread_job出力は、現在実行中のスレッド、完全なコードの関数名です。
import threading
#def main():
# print(threading.active_count())
# print(threading.enumerate()) # see the thread list
# print(threading.current_thread())
def thread_job():
print('This is a thread of %s' % threading.current_thread())
def main():
thread = threading.Thread(target=thread_job,)
thread.start()
if __name__ == '__main__':
main()
アプリケーションに参加
すべてのマルチスレッド操作が完了するのを待ちたいと、その後示したall done\n
のみ結合文を使用する必要があります。
import threading
import time
def thread_job():
print('T1 start\n')
for i in range(10):
time.sleep(0.1)
print('T1 finish\n')
def T2_job(temp):
print('T2 start\n')
print("-----in test2 temp=%s-----"% str(temp))
print('T2 finish\n')
def main():
added_thread = threading.Thread(target=thread_job, name='T1')
thread2 = threading.Thread(target=T2_job, args=(g_nums,), name='T2')
added_thread.start()
thread2.start()
thread2.join()
added_thread.join()
print('all done\n')
if __name__ == '__main__':
main()
キューアプリケーション
マルチスレッドは、結果の戻り値ではなく、すべてのスレッドは、演算結果が、長い待ち行列に入れ、その後、取り出すことができます。
import threading
import time
from queue import Queue
def job(l,q): # 执行函数
for i in range(len(l)):
l[i] = l[i]**2
q.put(l) # 把结果加入到队列中
def multithreading():
q = Queue()
threads = []
data = [[1,2,3],[3,4,5],[4,4,4],[5,5,5]]
for i in range(4): # 定义4个线程
t = threading.Thread(target=job, args=(data[i], q))
t.start()
threads.append(t)
for thread in threads:
thread.join() # 结束后再执行接下来的内容
results = []
for _ in range(4): # 从4个线程里面得到结果,按顺序拿出结果
results.append(q.get())
print(results)
if __name__ == '__main__':
multithreading()
GIL
Pythonの上のマルチスレッドではなく、実際には複数のスレッド間のクイックスイッチ。
import threading
from queue import Queue
import copy
import time
def job(l, q):
res = sum(l)
q.put(res)
def multithreading(l):
q = Queue()
threads = []
for i in range(4):
t = threading.Thread(target=job, args=(copy.copy(l), q), name='T%i' % i)
t.start()
threads.append(t)
[t.join() for t in threads]
total = 0
for _ in range(4):
total += q.get()
print(total)
def normal(l):
total = sum(l)
print(total)
if __name__ == '__main__':
l = list(range(1000000))
s_t = time.time()
normal(l*4)
print('normal: ',time.time()-s_t)
s_t = time.time()
multithreading(l)
print('multithreading: ', time.time()-s_t)
ロック
最初のスレッドは、スレッドで2回目の結果で終了し、。最初のスレッドは、第二のスレッドが動作するように一時的にできない場合、ロックは、使用されるであろう。彼らは次に何をすることができます前に、一つのスレッドをランク付けした後に終了します。
ときに、同じ変数の動作の二つのスレッドAは、グローバル変数です。その後、操作Aの時に別のスレッドによってロックされ 操作が完了した後、第2スレッド操作をさせているとき。
import threading
def job1():
global A, lock # 开始锁线程
lock.acquire()
for i in range(10):
A += 1
print('job1', A)
lock.release() # 释放锁
def job2():
global A, lock
lock.acquire()
for i in range(10):
A += 10
print('job2', A)
lock.release()
if __name__ == '__main__':
lock = threading.Lock()
A = 0
t1 = threading.Thread(target=job1)
t2 = threading.Thread(target=job2)
t1.start()
t2.start()
t1.join()
t2.join()
参照
https://www.bilibili.com/video/av16944429/?p=5
https://github.com/MorvanZhou/tutorials/tree/master/threadingTUT