理論的知識1.スレッド
スレッドとは何ですか
スレッドがパイプラインです。
プロセス?プロセスは何を経験して何をして開始されたのですか?
オープンプロセス:メモリ内のオープンスペースは、ロードするリソースとデータもこの空間のリソースを使用して、CPUの実行を呼び出します。
プロセス:メインタスク:オープンスペースは、データをロードします。
スレッド:パイプライン、コードを実行します。
プロセス:スペース、静荷重資源の部門。
スレッド:コード実行機能、ダイナミック。
抽象的な概念。
オープンQQは:プロセスを開く:メモリ、オープンスペースでは、データがコードを実行するスレッドを起動するためにロードされます。
スレッドは、プロセスが複数のスレッドを含むことができ、プロセスに依存しているが、メインスレッドが存在しなければならない。CPUスレッドは実行の最小単位です。
プロセス対スレッド(理論)
オープンマルチプロセスのオーバーヘッドが非常に大きい。10-100。のスレッドを回し、オーバーヘッドが非常に小さいです。
オープンマルチプロセスが遅い、速いオープンマルチスレッド。
プロセスデータは、キュー間で直接ことができない、同じプロセス内のスレッド間でデータを介して共有することができる共有することができます。
マルチスレッド・アプリケーション・シナリオの紹介
並行性:前後CPUスイッチ(スレッド間を切り替えるために)同時マルチプロセス、マルチスレッドの同時実行。
より複雑なプロセス:各プロセスのメインスレッドが内部タスクを実行するために、複数のプロセスを開きます。
マルチスレッド:プロセス、複数のスレッドがタスクを実行するプロセスを開きます。
マルチプロセスを使用する場合は、時にマルチスレッドを使用するには?
プログラム:三つの異なるタスクを実行します。
もし、後の仕事の経験の同時実行:マルチスレッド大半。
2つの方法で2.スレッド
# 第一种方式
from threading import Thread
def task(name):
print(f'{name} is running')
if __name__ == '__main__':
t = Thread(target=task,args=('mcsaoQ',))
t.start()
print('主线程')
#第二种方式
from threading import Thread
class MyThread(Thread):
def run(self):
print(f'{self.name} is running')
if __name__ == '__main__':
t = MyThread()
t.start()
print('主线程')
3.スレッドとプロセスとの間のコントラスト
コントラストスピード
from threading import Thread def task(name): print(f'{name} is running') if __name__ == '__main__': t = Thread(target=task,args=('mcsaoQ',)) t.start() print('主线程') ''' 线程绝对要比进程要快: mcsaoQ is running 主线程 '''
PID
# pid 进程号 from threading import Thread import os def task(): print(f'子线程: {os.getpid()}') if __name__ == '__main__': t = Thread(target=task,) t.start() print(f'主线程: {os.getpid()}')
スレッド間でリソースを共有します
from threading import Thread import time x = 1000 def task(): time.sleep(3) print('子线程....') def main(): print('111') print('222') print('333') if __name__ == '__main__': t = Thread(target=task) t.start() # t.join() main()
4.その他のスレッド
from threading import Thread
import threading
import time
def task(name):
time.sleep(1)
print(f'{name} is running')
print(threading.current_thread().name)
if __name__ == '__main__':
for i in range(5):
t = Thread(target=task,args=('mcsaoQ',))
t.start()
# 线程对象的方法:
# time.sleep(1)
# print(t.is_alive()) # 判断子线程是否存活 ***
# print(t.getName()) # 获取线程名
# t.setName('线程111')
# print(t.getName()) # 获取线程名
# threading模块的方法:
# print(threading.current_thread().name) # MainThread
# print(threading.enumerate()) # 返回一个列表 放置的是所有的线程对象
print(threading.active_count()) # 获取活跃的线程的数量(包括主线程)
print('主线程')
5.デーモンスレッド
ガーディアン:チャイルドガーディアン主は、限り、主要なエンドとして、サブエンドすぐに
終わり???メインスレッド
マルチスレッドは、同じスペース、同じプロセス、スペースの代わりにプロセスでは、リソースの静的メインスレッドは、プロセス空間メモリに生きています。必要な条件。
メインスレッド:。作業が終わった後、すべての上に子スレッドのすべてのために消えるのプロセスを待つ必要が
デーモンスレッドは、メインスレッドの終了前に終了するメインスレッドを待つ必要がありますが終了し、すべての非デーモンスレッドの終了を待つ必要があります。
デーモンスレッド:すべての非デーモンスレッドの終わりとメインスレッドが終了することができるように待機しなければなりません。
from threading import Thread
import time
def foo():
print(123)
time.sleep(3)
print("end123")
def bar():
print(456)
time.sleep(1)
print("end456")
if __name__ == '__main__':
t1=Thread(target=foo)
t2=Thread(target=bar)
t1.daemon = True
t1.start()
t2.start()
print("main-------")
6.ミューテックス(ロック)
ミューテックスロックは、同期ロックはロックです。
ミューテックスとの違いに参加?
ランダムかつ公正つかむためにミューテックスロック。不公平な、良いため、事前に参加しますが、シリアルです。
7.デッドロック、再帰的ロック
再帰的ロックは:再帰的なロックがロックされ、ロック・レコードは、取得長く、1をカウントするためにロックされ、回acquire2、2回は、リリース1回、マイナス1をカウントするためにロックされ、限り、ロック再帰カウンタが0ではないとして、他のスレッドをつかむことができません。
from threading import Thread
from threading import Lock
from threading import RLock
import time
# lock_A = RLock()
# lock_B = RLock()
lock_A = lock_B = RLock()
class MyThread(Thread):
def run(self):
# lock_A.acquire()
# lock_B.acquire()
# print(111)
# lock_A.release()
# lock_B.release()
self.f1()
self.f2()
def f1(self):
lock_A.acquire()
print(f'{self.name}拿到 A锁')
lock_B.acquire() # 第二个线程抢B锁
print(f'{self.name}拿到 B锁')
lock_B.release()
lock_A.release()
def f2(self):
lock_B.acquire()
print(f'{self.name}拿到 B锁')
time.sleep(1) # 第一个线程 睡1秒
lock_A.acquire() # 第一个线程抢A锁
print(f'{self.name}拿到 A锁')
lock_A.release()
lock_B.release()
if __name__ == '__main__':
# for i in range(3):
# t = MyThread()
# t.start()
t1 = MyThread()
t1.start()
t2 = MyThread()
t2.start()
t3 = MyThread()
t3.start()
print('主线程')
8.セマフォ
ロックがセマフォを入力するだけで一つのスレッドやプロセスを許可される前にいえば、複数のスレッドやプロセスが同時に入ることができます
from threading import Thread
from threading import current_thread
from threading import Semaphore
import time
import random
sm = Semaphore(4)
# lock= Lock()
def go_public_wc():
sm.acquire()
print(f'{current_thread().name}正在厕所')
time.sleep(random.randint(1, 3))
sm.release()
if __name__ == '__main__':
for i in range(20):
t = Thread(target=go_public_wc)
t.start()
# print('主')