前書き
スレッドモジュールには、一般的なスレッド関数、スレッドオブジェクト、ロックオブジェクト、再帰ロックオブジェクト、イベントオブジェクト、条件変数オブジェクト、セマフォオブジェクト、タイマーオブジェクト、フェンスオブジェクトなど、スレッド操作に関する豊富な関数が含まれています。
PythonにはGIL(グローバルインタープリターロック)が存在するため、真の並列スレッドは実現できませんが、並行スレッドは実現することしかできません。
この記事では、スレッドライブラリの基本的なメソッドを紹介します。その他の複雑なメソッドは、使用時に更新されます。
スレッドを作成する
最初のメソッド:threading.Threadを呼び出す
import threading
# target 相当于C中的 void*(*p)(),args是参数列表
thread = threading.Thread(target=target, args=[i])
2番目のメソッド:threading.Threadを継承するクラスを作成します
import time
import threading
class OwnThread(threading.Thread):
def __init__(self, para, sleep):
# 先调用父类的threading.Thread.__init__方法
super().__init__()
self.para = para
self.sleep = sleep
# 覆盖了父类的run方法
def run(self):
"""线程内容"""
time.sleep(self.sleep)
print(self.para)
def main():
# 创建线程
thread_hello = TestThread('hello', 1)
# 启动线程
thread_hello.start()
print('Main thread has ended!')
if __name__ == '__main__':
main()
スレッドを開始
スレッドを開始した後、スレッドはターゲットで指定された関数/実行対象の関数の実行を開始します
thread = threading.Thread(target=target, args=[i])
thread.start()
結合メソッド
従来の結合の概念と同様に、メインスレッドは、結合を実行しているスレッドがデモーンであるかどうかに関係なく、結合スレッドの実行が終了するのをブロックして待機します。
thread = threading.Thread(target=target, args=[i])
thread.join()
ロック
ロックを使用してグローバルリソースを保護します(延期したシステムソフトウェアを思い出さずにはいられません)
import threading
import time
lock=threading.Lock()
fuck = 0
def target(second):
global fuck
lock.acquire()
print(fuck)
tmp = fuck+1
time.sleep(0.001)
fuck = tmp
lock.release()
for i in range(1,1000):
thread = threading.Thread(target=target, args=[i])
thread.start()