Pythonの高度なプログラミングスキル-7、8、9マルチタスク、マルチスレッド、マルチプロセス、プロセスプールの説明

1.タスク、スレッド、およびプロセスの違い

a。タスク:ソフトウェアによって完了されたアクティビティを指します。タスクは、プロセスまたはスレッドのいずれかです。要するに、それは集合的に特定の目的を達成する一連の操作を指します。たとえば、データを読み取り、データをメモリに入れます。このタスクは、プロセスまたはスレッド(または割り込みタスク)として実装できます。
b、スレッド(トレッド):スレッドはプロセスに存在し、各スレッドは同じコードとグローバルデータを共有します
c、プロセス(プロセス):プログラムの実行として定義されることが多く、プロセスはリソース割り当ての基本単位ですが、スケジューリング操作の基本単位。実行中、各プロセスはメインコードをコピーして個別に実行し、メインプロセスは子プロセスの終了で終了します。

注:
1。スレッドはプロセス内に存在し、各スレッドはグローバル変数共有し、プロセス内の他の関数を呼び出すことができます
。2。プロセスには、独立したアドレス空間リソース割り当ての基本単位があります。
3.スレッドはプロセッサ(cpu)スケジューリングの基本単位です
。4。タスクはスレッドまたはプロセスにすることができます
。5。同時実行性:実行中のタスクの数はCPUの数と同じです。6。
並列:実行中のタスクの数CPUの数より少ない。、採用された方法はタイムスライスローテーションです。

したがって、プログラムの操作には、メモリとCPUの協力が必要です。

2つのマルチスレッドの詳細な説明

1、两个进程间遵循时间片轮转,无序,按照CPU调用来执行
2、各线程之间可以共用全局变量
3、IO较多的时候使用
import threading
i=1


def demo1(num):
    global i
    for _ in range(num):
        i=i+1
    print(f'demo1:{i}')


def demo2(num):
    global i
    for _ in range(num):
        i = i + 1
    print(f'demo2:{i}')


def mian():
    num=100000
    t1=threading.Thread(target=demo1,args=(num,))
    t2= threading.Thread(target=demo2,args=(num,))
    t1.start()
    t2.start()


if __name__ == '__main__':
    mian()

演算結果:
demo2:172631
demo1:100001

3つのマルチプロセスの詳細な説明

1、主进程在所有子进程结束后结束
2、start()创建子进程
3、join()表示该子进程结束后,继续运行主进程
4、is_alive()判断该线程是否存在
5、程序运行较慢的时候使用
import multiprocessing
import time
import os


def demo1():
    t1_start = time.time()
    time.sleep(2)
    print(f'p1:{os.getpid()}')
    t1_end = time.time()
    print(f'demo1_run_time:{t1_end - t1_start}')


def demo2():
    t1_start = time.time()
    time.sleep(5)
    print(f'p2:{os.getpid()}')
    t1_end = time.time()
    print(f'demo2_run_time:{t1_end - t1_start}')


def main():
    p1 = multiprocessing.Process(target=demo1, name='demo1', )
    p2 = multiprocessing.Process(target=demo2, name='demo2')
    p1.start()
    p2.start()
    # print(f'p1_is_alive:{p1.is_alive()}')
    # print(f'p2_is_alive:{p2.is_alive()}')
    p1.join()
    # print(f'p1_is_alive:{p1.is_alive()}')
    # print(f'p2_is_alive:{p2.is_alive()}')


if __name__ == '__main__':
    main()
    print(f'main:{os.getpid()}')

実行結果:
p1:9492
demo1_run_time:2.000339984893799
main:804
p2:4604
demo2_run_time:5.0002968311309814

4つのマルチプロセス通信

demo1プロセスのデータをdemo2プロセスにスローします

import multiprocessing


def demo1(q):
    q.put('test')


def demo2(q):
    print(q.get())


def main():
    q = multiprocessing.Queue(2)
    p1 = multiprocessing.Process(target=demo1, name='demo1', args=(q,))
    p2 = multiprocessing.Process(target=demo2, name='demo2', args=(q,))
    p1.start()
    p2.start()


if __name__ == '__main__':
    main()

結果を表示します:
テスト

5.プロセスプール

プロセスプールの役割:プロセスが多すぎる場合は、プロセスプールを使用できます

import multiprocessing


def demo1(q):
    q.put('test')



def demo2(q):
    print(q.get())



def main():
    p=multiprocessing.Manager().Queue()
    #Pool中执行任务为2个
    po=multiprocessing.Pool(2)
    po.apply_async(demo1,args=(p,))
    po.apply_async(demo2,args=(p,))
    po.close()
    po.join()


if __name__ == '__main__':
    main()

結果を表示します:
テスト

おすすめ

転載: blog.csdn.net/qq_37697566/article/details/104002391