python(5)プロセスとスレッド

3122 ワード

title:python(5)プロセスとスレッドtag:python
リファレンス
1.プロセス
サマリ
(1).プロセスfork()とプロセス、Pool(2)を実現する3つの方法がある.プロセス間通信Queue,Pipes
3つの方法でプロセスを実現する
fork
pid=os.fork()

Process windowsにはforkがなくmultiprocessで代用
from multiprocessing import Process
p=Process(target=   ,args=(    ))
p.start
p.join()

Poolプロセスプール、大量のサブプロセスを開始
from multiprocessing import Pool
p=Pool
#  
p.apply_async(   ,args=    )

プロセスは関数によって実行されます
プロセス間通信
Queue親プロセスQueueを作成し、パラメータとして2つのサブプロセスに渡す
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))

2.スレッド
スレッドを開始するには、関数を入力してThreadインスタンスを作成し、start()を呼び出して実行を開始します.
t = threading.Thread(target=   , name='   ')
t.start()
t.join()

ワイヤロック
マルチプロセスでは、同じ変数が各プロセスにコピーされます.しかし、複数のスレッドでは、変数はすべてのスレッドで共有され、複数のスレッドが同時に1つの変数を変更すると、変数が乱れやすくなります.
高度な言語の1つの文はCPUの実行時にいくつかの文で、たとえ1つの簡単な計算:balance = balance + nでも2つのステップに分けます:1.balance+nを計算し、一時変数に格納する.2.一時変数の値をbalanceに割り当てます.最初のスレッドは最初のステップのみを実行し、2番目のスレッドを実行します.そうすると、変数がまだ値を付けていないうちに、また変更され、変数が変更されます.
使用方法:
def run_thread(n):
    for i in range(100000):
        #      :
        lock.acquire()
        try:
            #      :
            change_it(n)
        finally:
            #          :
            lock.release()

pythonにスレッドロックをかける意味はありません.pythonにはGILグローバルロックがあるので、100コアのCPUでも毎回1つのスレッドしか実行できません.CPUは常に不満を走っている.C、C++、JAVAなどの高級言語は違います.クアッドコアのCPU、4つのデッドサイクルを書くと、4つのCPUの占有率は100%に達します.
1つのスレッドに1つのロックしかありません.複数のスレッドロックが存在するため、異なるスレッドには異なるロックがあり、相手が持っているロックを取得しようとすると、デッドロックになる可能性があります.
ThreadLocal
ローカル変数は自分のスレッドだけが表示され、他のスレッドには影響しませんが、グローバル変数はロックされます.通常のグローバル変数をdictに設定すると、異なるスレッドに必要な異なるkeyに対応し、アクセスが面倒になります.threadlocalのオブジェクトを作成できます.local_school = threading.local()というオブジェクトはdictと見なすことができますが、異なるスレッドがアクセスするときにどのスレッドを制定する必要がなく、自動的に処理されます.