記事のディレクトリ
呼び出しシーケンスおよび順序で非同期実行と同期をブロックし、非ブロック
二つのプロセスプールプールの関数を呼び出すの二つの方法:
名前 | 英文 | 中国の | 実装プロセス | リマーク |
---|---|---|---|---|
pool.apply() | シンクロナス | 同期呼び出し | 実行をブロック(ブロッキング) | 非効率性 |
pool.apply_aync() | 非同期な | 非同期呼び出し | プロセスは、非ブロッキング実行する(非ブロッキング) | 高性能 |
コンセプトは、我々が説明するために例を通して私を監督し、混合することが容易です
実装ブロッキングおよび非ブロッキング
同期および非同期呼び出し
シーケンスおよび順序および
非ブロック非同期並列実行を呼び出します
バーバーショップ((プロセスプールプール)2つの床屋がある1,2 と呼ばれる 2人の顧客Aさん、Mr.Bにプロセスが)、ゲストに散髪理髪タスク(タスク機能を与えることです計算すべき事項)、
理髪店の所有者(である、通話のすべてを見て恩着せ床屋の親プロセスの子プロセスの所有者を呼び出します)、。
上司は、効率的に物事を行うのが好き、使用しようとする非同期呼び出し非同期メソッドapply_aync()
、
およびプロセス(バーバー)は、非ブロッキング実行され
ている:
上司は、例えば(顧客へ行く(例えばCPU選択床屋1として)床屋を呼び出すためにAさん)髪は、かかわらず、Aさんジミー・エンドは、(プロセスかどうかの判断がなさかどうかの実行が完了するとすぐに、)を続けて理髪店は人手が不足し、まで上に配置されているすべての美容師に続いて、別の顧客に別の理髪理髪師のスケジュールを設定します(プロセス・プールのプロセスの数がいっぱいです)ので、顧客は唯一(タスクを一時的に待機する待機に中断)
であること、従業員として、上司は確かにそう意味の意味に、戻って「はい卿」へのフィードバックの手配が必要となります、もちろんそれは私が何を意味するかどのように平均値、(ビットは、関数が戻るただし、タスクが完了していないが、それだけでタスクを実行するために開始したことを指摘しておかなければ)。
彼らが作業しているプロセスが起動されるようにするには(床屋の作業)、非ブロックノンブロッキングを、私の第二の理髪師の受注は、最初の理髪師を妨げられることはありません遮断します。
神は私たちの視点で話すために、貧しい床屋1,2(二つのプロセスが呼び出された)を見て、あなたは彼らが並行して作業している知っている**(パラレル)**。
Q1:上部に書かれた私たちは、1理髪店とAさんのコード、それは1でなければならない最初の治療ではないでしょうか?
A1:不確実であるので、最初の1または2まず、制御できない、それは問題ではない(非同期まあ、他の人に影響を与えませんが)となっているスケジュールを処理しないように、CPU
上司のために、彼は作業状態の従業員を得るために、一方では、スタッフを呼び出すために望んでいる一方で、従業員が直接、他のスタッフの仕事を手配作業スタッフに至るまでの結果の後に呼び出して、それがある非同期呼び出し。あなたはスタッフのスケジュールを設定し、スタッフが熱心に実装の結果を待っている場合は終了しているので、それは同期呼び出し。
実行をブロックするシリアル同期呼び出し
それから、言うこと非同期呼び出し、同期呼び出し何が起こりますか?
同様に、2つの理髪店理髪1,2(プロセスが呼び出される)は、2つの顧客があるAさんMr.B、
理髪店の所有者は、使用しようとする同期呼び出しを同期する方法をapply()
理髪店ためだけ散髪場所QAQ
ボスは最初の理髪師1 Aさんジミー・エンドは、(プロセスかどうかの判断がなさのために、次に心配そうに待っている、(例えばAさんなど)顧客散髪に行く(例えばCPU選択床屋1など)床屋を呼び出して実行が完了すると、)続けて別の顧客に別の理髪理髪師をスケジュールし、
そして最後に床屋が終了1つの理由は、理髪ボスは(関数言って戻って(例えば美容2など)他の美容師が上がるために、)。注ことをコールバック関数が存在しないだけのリターンに、。
プロセスが起動されるようにするには(床屋の作業)、彼らは仕事をしているブロックされ、そして私の第二の個人的な注文は、最初の理髪師をブロックされます。
神のために(二つのプロセスが呼び出される)貧しい床屋1,2を見て、私たちの視点で言えば、**彼らはシリアル**(連番のまたはシリアル)の作品だったことを知っていました。
上司の場合は、一方では、彼はそれがあり、完成されたスタッフを設定し、スタッフが熱心に実装の結果を待っている場合は、作業状態の従業員を得るために、一方では、スタッフを呼び出すために望んでいる同期呼び出し。
同期呼び出し、この種のものは、発生する可能性が
FGAのドローカード
3サブ崩壊ポンプ妻
プレス神聖なキー(コール)、その後、我々は唯一の不安に目が画面上に固定されます(他の何かが、待機を行うことはできません)、私はゆっくりと光出力を見て、私たちは私の妻の表示されるまで、何もしません:)
OK、私の妻は2333年のうちのドローカードではありません、サーベルの剣はそれを準備するために、任意の反論をサポートしていない、若いです
FPGAのブロックの割り当ては、割り当てを非ブロック
(で、誰の仕事それらだから、プロセスコマンド文閉塞と呼ばれ、その逆もFPGAなどのノンブロッキング、用される(第2つの第一のブロック)を行うことはできません)、後者は以前のものは自分で、その結果、仕事を終えていないためには、非ブロックの割り当てと割り当てを遮断します。私たちは、理解を深めるための根本的な原因を組み合わせることができます。
私たちは、設定a=55 b=c=0
(初期値)
割り当てブロッキング:文の前に次のステートメントの前に、実行される(ステートメントがワーク呼び出されると考えることができる)、すなわち:上記のステートメントが実行される(床屋1)(B =)文の終わりをブロック(バーバー区分2)(C = B)を行います。
ビューの神ポイントが、それは、二つの文のようで、注文実行を
し、我々は、同期呼び出しの両方
の二つの文の間にブロックされました
always @(posedge clock)
begin
b = a;
c = b;
end
FPGAことに注意してくださいalways@(posedge clock)
、クロック信号の立ち上がりエッジにそれは敏感で、各立ち上がりエッジ、コード内部の実装に常に声明。完了クロックの同じ立ち上がりエッジで、上から下へ、以下のシミュレーション結果は、クロックは、RST、A、B、である cは5つの信号、(第2の)RST信号を無視してください。
割り当てをノンブロッキング:上記の文(床屋1)を実行する(B =)バックの実装を妨げない(2バーバー)ステートメント(C = B)
always @(posedge i_clk)
begin
b <= a;
c <= b;
end
ビューの神ポイントが、それは、二つの文思えると注文実行を
し、我々は、非同期呼び出しの両方の
二つの文の間にノンブロッキング
クロックの最初の立ち上がりエッジは、
「値を割り当てB
」B値Cが割り当てられている
第二の文、最初、Bは依然として初期値0であり、Bは、二つの並列実行が終了するまで更新されていない
Aから「B 55であった
B面を与えるために「C 0
第2のクロックの立ち上がりエッジは、
「Bの値を割り当てる
「C b値が割り当てられ
、並列に実行
55から得られたB」
B側から得られた"C 55
したがって、Cの値が得られ、2つのCLKを完了するために必要です。
以下に示すように、シミュレーション結果:上下には、クロック、RST、A、B、である cは5つの信号、(第2の)RST信号を無視してください。
実際には、非ブロッキング割り当て、包括的合成両者のうちのラッチは、ラッチの割り当てをブロックする(ワイヤーと同様に)直接接続です。
Pythonアプリケーション
ノンブロッキングの非同期呼び出し
#-*- utf-8 -*-
from time import sleep,time
from random import random
import os
from multiprocessing import Process
from multiprocessing import Pool
def ftask(task_name):
print("开始理发",task_name)
start = time()
a = random()
sleep(a if(a>0.4) else a+0.4)
end = time()
return " {}发理完了,用时:{},进程id:{}".format(task_name,(end-start), os.getpid() )
list_barber = []
def fcallback(n):
list_barber.append(n)
if __name__ == '__main__':
pool = Pool(5)
task_set = ["Mr.A","Mr.B","Mr.C","Mr.D","Mr.E","Mr.F","Mr.G"]
for task in task_set:
pool.apply_async(ftask,args=(task,),callback=fcallback)
pool.close()
pool.join()
for barber in list_barber:
print(barber)
結果は以下の通りであります:
开始理发 Mr.A
开始理发 Mr.B
开始理发 Mr.C
开始理发 Mr.D
开始理发 Mr.E
开始理发 Mr.F
开始理发 Mr.G
Mr.A发理完了,用时:0.7314853668212891,进程id:12224
Mr.B发理完了,用时:0.7336766719818115,进程id:18748
Mr.D发理完了,用时:0.8218517303466797,进程id:18736
Mr.E发理完了,用时:0.8295514583587646,进程id:9980
Mr.C发理完了,用时:0.998112678527832,进程id:20308
Mr.F发理完了,用时:0.4738035202026367,进程id:12224
Mr.G发理完了,用时:0.9274580478668213,进程id:18748
同期呼び出しを着信拒否
#-*- utf-8 -*-
from time import sleep,time
from random import random
import os
from multiprocessing import Process
from multiprocessing import Pool
def ftask(task_name):
print("开始理发",task_name)
start = time()
a = random()
sleep(a if(a>0.4) else a+0.4)
end = time()
print(" {}发理完了,用时:{},进程id:{}".format(task_name,(end-start), os.getpid() ))
list_barber = []
def fcallback(n):
list_barber.append(n)
if __name__ == '__main__':
pool = Pool(5)
task_set = ["Mr.A","Mr.B","Mr.C","Mr.D","Mr.E","Mr.F","Mr.G","Mr.H"]
for task in task_set:
pool.apply(ftask,args=(task,))
pool.close()
pool.join()
print("main process ended")
結果は以下の通りであります:
开始理发 Mr.A
Mr.A发理完了,用时:0.5076336860656738,进程id:17828
开始理发 Mr.B
Mr.B发理完了,用时:0.9321200847625732,进程id:19788
开始理发 Mr.C
Mr.C发理完了,用时:0.47928452491760254,进程id:19548
开始理发 Mr.D
Mr.D发理完了,用时:0.439760684967041,进程id:19112
开始理发 Mr.E
Mr.E发理完了,用时:0.9770023822784424,进程id:11848
开始理发 Mr.F
Mr.F发理完了,用时:0.45802879333496094,进程id:17828
开始理发 Mr.G
Mr.G发理完了,用时:0.5110907554626465,进程id:19788
开始理发 Mr.H
Mr.H发理完了,用时:0.7647738456726074,进程id:19548
main process ended
要約6つのワード
黒板単語リストをノック:
ポジティブ | 中国の | アンチ | 中国の |
---|---|---|---|
シンクロナス | 同じ時刻同期で | 非同期な | 非同期異なる時間 |
シリアルシーケンシャル | シリアル順 | 並列同時 | 並列同時 |
ブロッキング | おもり | ノンブロッキング | ノンブロッキング |