ディレクトリ
第15章、スレッドの並行プログラミング
1.スレッドとは何ですか
正しい概念:プロセスが実際に実行の単位ではありませんが、プロセスは、リソース単位である各プロセスのスレッドが付属して、スレッド実行ユニットは、CPUの上にあります
要約の理解:
プロセスは、システム上で実行されるアプリケーションを指し、スレッドは実行のプロセス内のリソースのシステムプロセッサ時間割り当て、または別個のユニットの基本単位です。スレッドのスケジューリング単位であるオペレーティングシステム、へ。
线程:cpu最小的执行单位
进程:资源集合/资源单位.
线程运行 = 运行代码
进程运行 = 各种资源 + 线程
写真は理解して:
例として理解します:
在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程
在工厂中, 每个车间都有房子,而且每个车间默认就有一条流水线.
2.プロセスおよびスレッドとの間の差
スレッド:メモリ空間の共有データの単一のスレッド(プロセス内のデータ)
プロセス:物理メモリ空間分離(互いに分離複数のプロセスのメモリ空間)
これは、プロセスのメモリ空間を開くために、オペレーティング・システムに指示します
スレッド(スレッドを作成するプロセスの100倍の速度である)タスクコードを実行するためにオペレーティング・システムに指示であります
2つの方法で3. [スレッド
ファンクションオープン
from threading import Thread
import time
def task(name):
print('%s is runing '%name)
time.sleep(2)
print('%s is done'%name)
t=Thread(target=task,args=('子线程',))
t.start()
オープンクラス
class Task(Thread):
def run(self):
print('%s is runing ' % self.name)
time.sleep(2)
print('%s is done' % self.name)
t = Task()t.start()print('zhu')
4.子プロセススピードのサブスレッドを作成します。
from threading import Thread
from multiprocessing import Process
import time
def task(name):
print(f'{name} is running')
time.sleep(2)
print(f'{name} is end')
if __name__ == '__main__':
t = Thread(target=task,args=('子线程',))
p = Process(target=task,args=('子进程',))
# t.start()
p.start()
print('主')
------------------------------------------------
############开启子线程的打印效果:################
子线程 is running
主
子线程 is end
##########开启子进程打印效果:##################
主
子进程 is running
子进程 is end
概要:速いプロセスの作成よりもスレッド
子供の5.証拠は、共有データをスレッド
from threading import Thread
import time,os
x = 100
def task():
global x
x = 50
print(os.getpid()) # 4652
if __name__ == '__main__':
t = Thread(target=task)
t.start()
time.sleep(2)
print(x) # 50
print(os.getpid()) # 4652
------------------------------------------
4652
50
4652
オープンプロセスは、新しい子プロセスのメモリ空間を開放して、スレッドオープナースレッドは、共有メモリ空間であります
すなわち:子供を開くためのプロセスのpid数は同じではありません、
オープンスレッドは、同じスレッドを唱えるPID
6.スレッドは、メソッドに参加します
シングル子スレッド
子线程 start
主线程
子线程 endfrom threading import Thread
import time
def task():
print('子线程 start')
time.sleep(2)
print('子线程 end')
def task2():
print('子线程 start')
time.sleep(5)
print('子线程 end')
t = Thread(target=task)
t.start()
t2.start()
t.join() # 等待子线程运行结束
print('主线程')
-------------------------------
子线程 start
子线程 end
主线程
----------------------------------
#给t.join()加注释的结果如下
子线程 start
主线程
子线程 end
説明:メインスレッドがスタート睡眠子スレッドと、そのような時間を待つことになるが、子スレッドは()の前に、子スレッドのみ実行するように、上で実行しなければならないことを示し、参加print('主线程')
t.joinを与えた場合にのみ、メインスレッドが終了すると、 ()コメントを追加するには、メインスレッドが終了し、メインスレッドを直接終了します。
複数の子スレッド
from threading import Thread
import time
def task(name,n):
print(f'{name} start')
time.sleep(n)
print(f'{name} end')
t1 = Thread(target=task,args=('线程1',1))
t2 = Thread(target=task,args=('线程2',2))
t3 = Thread(target=task,args=('线程3',3))
start = time.time()
t1.start()
t2.start()
t3.start()
t1.join() # 111s
t2.join() #
t3.join()
end = time.time()
------------------------------------------
线程1 start
线程2 start
线程3 start
线程1 end
线程2 end
线程3 end
3.0022878646850586
#主线程开始->线程1开始->线程1结束->线程2开始->线程2结束->线程3开始->线程3结束->主线程结束
#因为1线程、2线程、3线程进入了同一个方法,本应该"同时"start()运行,但是现在是线程1 在start后使用join,那么线程2会老老实实的等线程1先跑完
説明:複数のスレッドの同時実行を実装
考えます
単一のCPUコアの場合、複数のスレッドの使い方を考えてみて?
:シングルコアCPU上で動作するマルチスレッドプログラム、同時に一つだけのスレッドの実行は、システムは、あなたがそれをスレッドを助けるために切り替わり、各タイムスライスを実行する各スレッドにタイムスライスのシステムの割り当ては、おそらくおよそ10ミリ秒、ルックスです実際に支出を増やし、同時に実行したいが、各スレッドは、実際に他のスレッドを実行し続けるに少し変更を実行していることは、スレッドの切り替えの効率を改善されません
7.参加のプロセスを理解します
from multiprocessing import Process
from threading import Thread
import time
def task():
print('进程 开启')
time.sleep(10)
print('进程 结束')
def task2():
print('子线程 开启')
time.sleep(2)
print('子线程 结束')
if __name__ == '__main__':
p = Process(target=task)
t = Thread(target=task2)
t.start() # 开线程
p.start() # 开进程
print('子进程join开始')
p.join() # 主进程的主线程等待子进程运行结束
print('主')
8.その他の関連用法スレッド
# print(t1.is_alive()) # True
# print(t1.getName()) # Thread-1
# print(t2.getName()) # Thread-2
# t1.setName('班长')
# print(t1.getName())
# print(currentThread().name)
# print(enumerate()) # [<_MainThread(MainThread, started 1856)>, <Thread(Thread-1, started 6948)>, <Thread(Thread-2, started 3128)>]
# print(activeCount()) # 3
# print(len(enumerate())) # 3