スレッドとプロセスの概念についての理解の紹介:
进程: 打开一个程序至少会有一个进程 它是cpu调度的最小的单位。
线程: 程序执行的最小单位,一个进程里面至少有一个线程,cpu会控制进程里面的线程。
打个比方:(1)打开一个qq就是一个进程的话,那么你可以同时和好多人聊天,和一个人聊天这就是一个线程。
(2)再打个比方,一条直行的高速公路,分好几个车道,这整个告诉公路就相当于一个进程,
那些车道就相当于一个个线程,如果有一条车道上的车拐弯,别的车道的车就要等待,不然就撞车了。
注意:
(1)一个cpu同一时间只能处理一件事,如果同时有多个任务,那么就轮换着执行,但是每个任务执行的时间非常短暂,无法感受到。
(2)使用线程的时候,不管它的顺序,因为cpu是随机调度的。
(3)一个程序的执行,就会有一个主线程
ステージ1:スレッドを実装します
1.スレッド・モジュール
Pythonはカプセル化されているスレッドのスレッド、2つの標準ライブラリのスレッド通すとスレッドのサポートを提供します。threadingモジュールは、スレッド、ロック、RLOCK、条件その他のコンポーネントを提供します。
因此在实际的使用中我们一般都是使用threading
2.Threadクラス
スレッドを作成します3。
Pythonでスレッドを作成し、Threadクラスの継承のインスタンスThreadクラスのThreadクラスとインスタンスを上書きする2つの方法があります。
Threadクラスの例:
スレッドを作成します。4.
Threadクラスの継承
5.Join&は、setdaemon
(1)
これらの2つの方法について話の前に、メインスレッドがコンセプトとサブスレッドを知っている必要があります
メインスレッド:プログラムが起動すると、実行中のスレッドがあるが、スレッドは通常、アプリケーションのメインスレッドと呼ばれています
子スレッド:プロシージャが最初に実行されるため、あなたがスレッドを作成する必要がある場合は、子を作成したスレッドは、メインスレッドスレッド
それは2つの方法でメインスレッドの重要性を反映している:1.他のスレッドの子スレッド2を生成するために通常それはさまざまな操作を実行するために、このようなクローズドの実装を確定しなければなりません
(2)
参加:、スレッドの実行の終わりのjoin()メソッドを呼び出しまで、呼び出し元をブロックダウン続けます
フェーズII:スレッド間通信
1.ミューテックス
マルチスレッドでは、すべてのスレッドのすべての変数が共有され、我々はデータをロックするミューテックスを必要とするので、それゆえ、最大の危険は、複数のスレッドが同時に変数を変更することで、スレッド間でデータを共有するために、それは、混乱になります。
2.スレッド間で共有グローバル変数
ヒント!スレッドは、同じプロセスに属しているので、それらの間の共有メモリ領域そう。だから、グローバル変数はpublicです。
3.共有メモリの問題間の競争があります
from threading import Thread
x = 0
n =1000000
def a(n):
global x
for i in range(n):
x += 1
def b(n):
global x
for i in range(n):
x -= 1
if __name__ == '__main__':
a = Thread(target=a,args = (n,))
b = Thread(target=b,args = (n,))
a.start()
b.start()
a.join()
b.join()
print(x)
ヒント!百万効果が発生することができない場合は後ろに0を追加し続けることができます
あなたは奇妙な結果を見つけることができます!!!
4.使用して、共有リソースへのアクセスを制御するためにロックします
導入された次のミューテックス
複数のスレッドでは、すべてのスレッドのすべての変数が共有されている私たちがミューテックスを必要とするので、それゆえ、最大の危険は、複数のスレッドが同時に変数を変更することで、スレッド間でデータを共有するために、それは、混乱になりますデータをロックします。
限り、グローバル変数は、単に操作ロック、ロック解除の前にして、操作の完了後に、リソースの競合の問題を解決するときに我々が作動して!!!
キューの基本的な考え方
入口、第アウト第一出口(FIFO)
一目でキュー操作:
置く(アイテム):チームへ
チーム:取得()
空試験:空の()
完全なテスト:フル()
キューの長さ:QSIZE()
任務の終了:task_done()
完了を待ち:参加()
注:
タスク完了のためのGET()待ち、そうでない場合はtask_done()などの長文が完了したことを示すために追加されたように、タスクが完了していないことを示しています。実行終了まで。
タスクが完了するまで(つまり、標準を完了するのにかかるたびにtask_done()されている)ブロックされている参加
ステージ3:スレッドプール
コンセプトプール
メインスレッド:生産者と同等の、ちょうどスレッドプールにジョブを送信。
并不关心线程池是如何执行任务的。
スレッドプール:消費者の同等は、タスクを受信するための責任があります
并将任务分配到一个空闲的线程中去执行。
因此,并不关心是哪一个线程执行的这个任务。
2.スレッドプールの単純な実装
from threading import Thread
from queue import Queue
import time
class ThreadPool:
def __init__(self,n):
self.queue = Queue()
for i in range(n):
Thread(target = self.worker,daemon = True).start()
def worker(self):
while True:
func,args,kwargs = self.queue.get()
func(*args,*kwargs)
self.queue.task_done()
def apply_async(self,target,args = (),kwargs = {}):
self.queue.put((target,args,kwargs))
def join(self):
self.queue.join()
def fun(x):
print('hello 第%s次'%x)
time.sleep(3)
print('帅哥美女就给点赞啦!')
t = ThreadPool(2)
for i in range(10):
t.apply_async(fun,args = (i,))
t.join()
内蔵スレッドプール3.python
from multiprocessing.pool import ThreadPool
import time
pool = ThreadPool(2) #创建两个线程
def funa(x,y):
print('%s好好学习'%x)
time.sleep(3)
print('天天向上')
def funb(x,y):
print('%shello'%x)
time.sleep(3)
print('world')
#我们这就是有一个线程池,里面有两个等待处理任务的线程,然后这两个函数就是两个任务,
#线程池里一个线程处理一个,所以会同时输出!如果多于两个任务就会执行等待sleep
pool.apply_async(funa,args = ('我们要————',2)) #将任务添加到线程池
pool.apply_async(funb,args = ('大家要————',4))
pool.close() #close之后则无法向线程池提交任务
#内置线程池,自带守护线程,主线程结束,子线程也跟着结束
#所以需要加阻塞,否则主线程一结束,子线程也跟着结束,无输出
pool.join() #在join之前可使用终止线程,直接终止线程pool: pool.terminate()
print('这是程序的最后一行,执行到这里,主线程结束')
4.その他の操作プール
オペレーティング:クローズ - クローズチャンネルを提出し、ジョブを送信することは許されません
オペレーティング2:終了 - プロセスプールアボート、すべてのタスクを一時停止