pythonプロセス、スレッド、スレッド

15383 ワード

プロセス
プロセスは実行中のプログラムです.各プロセスには、独自のアドレス空間、メモリ、データスタック、および実行を追跡するための他の補助データがあります.シングルコアCPUシステムのマルチプロセスでは、メモリには多くのプログラムがあり得るが、所与の時点で1つのプログラムしか実行されていない.つまり、この秒はプロセスAを実行し、次の秒はプロセスBを実行する可能性があります.両方ともメモリの中にありますが、実際には同時に実行されません.プロセスはシステムリソースの割り当ての最小単位です.プロセスには独自のメモリスペース(データが共有されず、オーバーヘッドが大きい)がある.プロセスによるマルチプロセスの実現
from multiprocessing import Process, Pool

def do_work():
    print('      ,   ID: {}'.format(Process.pid))

if __name__ == '__main__':
    p = Process(target=do_work)
    p2 = Process(target=do_work)
    p.start()
    p2.start()
    p.join()
    p2.join()

二.プロセスプールによるマルチプロセスの実現
from multiprocessing import Process, Pool

def do_work():
    print('      ,   ID: {}'.format(Process.pid))

if __name__ == '__main__':
    pool = Pool(processes=2)
    for i in range(0, 2):
        pool.apply_async(do_work)
    pool.close()
    pool.join()

三.python3.2以降のプロセスプールの標準ライブラリProcessPoolExecutor
from concurrent.futures import ProcessPoolExecutor
from time import  sleep


def loop(nloop, nsec):
    print("start process", nloop)
    sleep(nsec)
    print("end process", nloop)


if __name__=="__main__":
    with ProcessPoolExecutor(max_workers=3) as executor:
        all_task = [executor.submit(loop, i, j) for i, j in zip([1, 2], [4, 3])]

スレッド
スレッドは実行をスケジューリングする最小単位であり、プロセスに従属し、プログラムの実際の実行者である.1つのプロセスには、少なくとも1つのプライマリ・スレッドが含まれているか、より多くのサブスレッドが含まれている可能性があります.Pythonはマルチスレッドを実行できますが、シングルコアCPUマルチプロセスと同様に、所定の時点で1つのスレッドしか実行されません.複数のスレッドがメモリ(データ共有、グローバル変数共有)を共有し、プログラムの実行効率を向上させる.threadingによるマルチスレッドの作成
from threading import Thread
from time import sleep


def do_work(params):
    print('start Thread {}'.format(params))
    sleep(5)
    print('end Thread {}'.format(params))


if __name__ == '__main__':
    th = Thread(target=do_work, args=('th', ))
    th2 = Thread(target=do_work, args=('th2', ))
    th.start()
    th2.start()
    th.join()
    th2.join()

二.スレッドプールを使用したマルチスレッドの作成
from concurrent.futures import ThreadPoolExecutor


def do_work(params):
    print('start Thread {}'.format(params))
    sleep(5)
    print('end Thread {}'.format(params))

if __name__ == '__main__':
    with ThreadPoolExecutor(max_workers=3) as executor:
        all_task = [executor.submit(do_work, i) for i in range(1, 3)]

きょうてい
協程:ユーザー状態の軽量レベルのスレッドで、協成のスケジューリングは完全にユーザーによって制御される.スレッドより軽量レベルの存在です.1つのプロセスが複数のスレッドを持つことができるように、1つのスレッドが複数のコヒーレンスを持つこともできます.最も重要なのは、コプロセッサはオペレーティングシステムのカーネルによって管理されるのではなく、完全にプログラムによって制御されるコプロセッサが自分のレジスタ、コンテキスト、スタックを持っていることです.コンシステントスケジューリングの切り替え時に、レジスタコンテキストとスタックを他の場所に保存します.切り取ったとき、以前に保存したレジスタコンテキストとスタックに返信します.直接操作スタックはカーネル操作のオーバーヘッドがほとんどなく、ロックをかけずにグローバル変数にアクセスし、コンテキストの切り替えが速い.一.gevent実現コヒーレンス
import gevent


def eat(name):
    print('%s eat 1' %name)
    gevent.sleep(2)
    print('%s eat 2' %name)


def play(name):
    print('%s play 1' %name)
    gevent.sleep(1)
    print('%s play 2' %name)


if __name__ == '__main__':
    
    g1 = gevent.spawn(eat, 'egon')
    g2 = gevent.spawn(play, name='egon')
    g1.join()
    g2.join()