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()
結果を表示します:
テスト