Pythonマルチタスクのプロセス

15615 ワード

プロセスマルチプロセス
プロセスの概念
プログラムは実行されていないコードで、静的です.
プロセスは実行されたプログラムであり、プロセスはプログラムが実行された後と資源の総称である.
プログラムは1つしかありませんが、同じプログラムには複数のプロセスがあります.例えば、パソコンにQQをたくさんつけます.
プログラムとプロセスの違いは、リソースがあるかどうか、プロセスにはリソースがあり、プログラムにはリソースがなく、プロセスはリソース割り当ての基本ユニットである.プログラムは実行していない時資源がなくて、グラフィックスカードがなくて、ネットカードがなくて、など;ダブルクリックして実行するとカメラがあり、ネット速度などがあり、プロセスと呼ばれます.
プロセスのステータス
プロセス状態図
 
  • 準備状態:動作条件が遅くなり、cpuで
  • を実行するのを待っています.
  • 実行状態:cpuがその機能を実行中
  • 待機状態:プログラムsleepのようないくつかの条件が満たされるのを待つ、このとき待機状態
  • にある.
    プロセスを使用してマルチタスクを完了
    プロセスの使用手順とスレッドの使用手順は基本的に一致している.
    プロセスの使用手順:
  • multiprocessingをインポートします.
  • マルチタスクを記述するために必要な関数.
  • multiprocessingを作成する.Processクラスのインスタンスオブジェクトが関数参照に入力されます.
  • インスタンスオブジェクトのstartメソッドを呼び出し、サブスレッドを作成します.

  • プロセス使用手順の説明:
     
    プロセス使用手順コード
    import time
    import multiprocessing
    
    
    def sing(): while True: print("-----sing-----") time.sleep(1) def dance(): while True: print("-----dance-----") time.sleep(1) def main(): p1 = multiprocessing.Process(target=sing) p2 = multiprocessing.Process(target=dance) p1.start() p2.start() if __name__ == "__main__": main() 

    実行結果:
    -----sing-----
    -----dance-----
    -----sing-----
    -----dance-----
    -----sing-----
    -----dance-----
    ......
    

    プロセス:
  • メインプロセスには何があり、サブプロセスには何かリソースがあります.
  • スレッドはマルチタスクを作成でき、プロセスもマルチタスクを作成できますが、プロセスにかかるリソースは比較的大きいです.
  • だから実行するプロセス数は、必ずしも多ければ多いほど良いとは限らない.
  • サブプロセスを作成すると、メインプロセスのリソース、コード、メモリなどがコピーされますが、pidなど、独自の場所があります.
  • マルチプロセス間の共有コードとして理解できます.すなわち、1つのコードしかありませんが、同じコードを指す矢印が複数あります.
  • 共有できるものは共有し、共有できないものはコピーする.修正する必要がないのは共有して、修正する時あなたに1部コピーして、これは書く時コピーです;

  • プロセスidの取得
    プロセスidコードの取得
    from multiprocessing import Process
    import osdef run_proc():
        """         """
        print('      ,pid=%d...' % os.getpid()) # os.getpid           print('       ...') if __name__ == '__main__': print('   pid: %d' % os.getpid()) # os.getpid           p = Process(target=run_proc) p.start() 

    プロセスとスレッドの比較
    プロセスとスレッドの違い
  • プロセスは、システムがリソースの割り当てとスケジューリングを行う独立した単位である.
  • スレッドはプロセスのエンティティであり、CPUスケジューリングと割り当ての基本単位であり、オペレーティングシステムスケジューリングの単位であり、プロセスよりも小さく独立して実行できる基本単位である.
  • プログラムには少なくとも1つのプロセスがあり、1つのプロセスには少なくとも1つのスレッドがある.
  • スレッドの区分スケールはプロセスより小さく(リソースはプロセスより少ない)、マルチスレッドプログラムの同時性が高い.
  • プロセスは、実行中に独立したメモリユニットを有し、複数のスレッドがメモリを共有することで、プログラムの実行効率を大幅に向上させる.
  • スレッドは独立して実行できず、プロセスに依存しなければならない.
  • プロセスが先にあり、スレッドがあります.
  • スレッドは資源で仕事をします.
  • マルチスレッドがマルチタスクを実現できるとは、1つのプロセスリソースに複数の矢印があることを意味する.マルチスレッドは、同じリソース内に複数の矢印が同じコードを実行します.
  • マルチプロセスのマルチタスクは、またリソースを開き、このリソースの中に矢印があります.
  • プロセス実行方式1:1つのリソースに複数の矢印が実行されている.
  • プロセス実行方式2:複数のリソースがあり、各リソースに矢印実行コードがある.
  • スレッドの実行コストは小さいが、資源の管理と保護に不利であり、プロセスは正反対である.
  • 開発ではマルチスレッド用が多い.

  • キューによるプロセス間通信の完了
    キュー使用構文{{キューしよう:こうぶん}}
    #     :
    from multiprocessing import Queue
    q = Queue(3)
    #         : q.put(xxx) #         : q.get() 

    キューによるプロセス間通信コードの完了
    from multiprocessing import Queue
    import multiprocessing
    
    
    def download_data(q): """           """ data = [11, 22, 33] for i in data: q.put(i) print("      ") def deal_data(q): """              """ data_list = [] while True: data = q.get() data_list.append(data) if q.empty(): break print("      ,   :", data_list) def main(): q = Queue(3) p1 = multiprocessing.Process(target=download_data, args=(q,)) p2 = multiprocessing.Process(target=deal_data, args=(q,)) p1.start() time.sleep(1) p2.start() if __name__ == '__main__': main() 

    実行結果:
          
          ,   : [11, 22, 33]
    

    プロセスプールがマルチタスクを完了
    プロセスプール
    プロセスプールの概念
    プロセスの作成と破棄には大量のリソースが必要であるため、消費を減らすために、100のタスクなどのマルチタスクを処理するときに、10のプロセスを作成してから、この10のプロセスで100のタスクを実行することができます.プロセスを繰り返し使用して、リソースを節約する目的に達することができます.これはプロセスプールを使用することができます.
    プロセスプールの作成タスク数は固定され、少ないので、普通のプロセスでいいです.タスク数が不確定で、比較的多い場合はプロセスプールを使用します.プロセスプールはプロセスの実行が完了するのを待つことはありません.poを使用する必要があります.join()メインプロセスをプロセスプール内のプロセスの実行が完了するのを待たせる.そしてpo.close()はjoinの前にある必要があります.編集者はPythonの資料とPDFを整理して、Pythonの学習資料が必要な場合は学習グループを加えることができます:631441315、どうせ暇でも暇ですから、何か勉強したほうがいいですよ~~
    プロセスプール構文の作成
    #      
    from multiprocessing import Pool
    po = Pool(3)
    
    #             po.asyn(sing, (num,)) #              po.close() po.join() 

    プロセスプールpoolの例
    from multiprocessing import Pool
    import os, time, random
    
    
    def worker(msg): t_start = time.time() print("%s    ,    %d" % (msg, os.getpid())) # random.random()    0~1       time.sleep(random.random() * 2) t_stop = time.time() print(msg, "    ,  %0.2f" % (t_stop - t_start)) def main(): po = Pool(3) #        ,     3 for i in range(0, 10): # Pool().apply_async(      ,(          ,)) #                      po.apply_async(worker, (i,)) print("----start----") po.close() #      ,   po         po.join() #   po          ,    close     print("-----end-----") if __name__ == '__main__': main() 

    実行結果:
    ----start----
    0    ,    7812
    1    ,    9984
    2    ,    1692
        ,  0.65
    3    ,    9984
        ,  1.08
    4    ,    7812
        ,  1.82
    5    ,    1692
        ,  1.12 6    ,    7812     ,  1.35 7    ,    9984     ,  0.11 8    ,    9984     ,  0.50 9    ,    7812     ,  0.65     ,  0.70     ,  0.74 -----end----- 

    マルチプロセスコピーフォルダ
    マルチタスクフォルダcopy
    手順:
  • 1.ユーザーがコピーするフォルダの名前を取得します.
  • 2.新しいフォルダを作成します.
  • 3.フォルダのコピー対象のすべてのファイル名を取得します.listdir()
  • 4.プロセスプールを作成します.
  • 5.元のフォルダのファイルをコピーして、新しいフォルダのファイルに行きます.

  • マルチタスクコピーファイルコード
    import os
    from multiprocessing import Pool
    
    
    def copy_file(file, old_folder, new_folder): old_f = open(old_folder+"/"+file, "rb") data = old_f.read() old_f.close() new_f = open(new_folder+"/"+file, "wb") new_f.write(data) new_f.close() print("      :", file) def main(): # 1.          old_folder = input("           :") # 2.       new_folder = old_folder + "_  " try: os.mkdir(new_folder) print("       ") except Exception as e: pass # 3.              ,listdir() files_list = os.listdir(old_folder) # print(files_list) # 4.      po = Pool(5) for file in files_list: #                po.apply_async(copy_file, args=(file, old_folder, new_folder)) #           ,       po.close() po.join() if __name__ == '__main__': main() 

    フォルダのコピーが完了した後、コピーファイルの進捗バーを表示する必要が追加されました.どうすればいいですか?
    マルチタスクでファイルをコピーし、進捗バーを表示
    プロセスプールでQueueを使用する場合は、from multiprocessing import Managerを使用し、Manager()を使用します.Queue();
    進捗バーの考え方を表示します.
  • キューを作成します.
  • はコピーファイルの関数にキューを転送し、1つのファイルをコピーするとqにファイル名を転送する.
  • 主関数でlistdir()内のすべてのファイル数を計算します.
  • 主関数にnumを定義し、初期値は0である.
  • 主関数にwhile trueを定義し、qからファイルを取得するファイルを取得するたびにnum+1
  • はnumの値が総ファイル数以上である場合、breakを計算する.
  • コピーされたファイルの数numを使用して、合計ファイルの数で除算するコピーの進行状況です.先頭rとend="を使用して、表示の進行状況を改行しないようにします.次のようにします.
  • .
    print("\r     %.2f %%" % (copy_ok_file_num*100/all_file_len), end="")
    

    マルチタスクでファイルをコピーし、プログレスバーコードを表示します.
    import os
    from multiprocessing import Pool, Manager
    
    
    def copy_file(q, file, old_folder, new_folder): old_f = open(old_folder+"/"+file, "rb") data = old_f.read() old_f.close() new_f = open(new_folder+"/"+file, "wb") new_f.write(data) new_f.close() q.put(file) def main(): # 1.          old_folder = input("           :") # 2.       new_folder = old_folder + "_  " try: os.mkdir(new_folder) print("       ") except Exception as e: pass # 3.              ,listdir() files_list = os.listdir(old_folder) # 4.      po = Pool(5) # 5.     q = Manager().Queue() # 6.          ,       for file in files_list: #                po.apply_async(copy_file, args=(q, file, old_folder, new_folder)) all_file_len = len(files_list) po.close() # po.join() copy_ok_file_num = 0 while True: file = q.get() copy_ok_file_num += 1 print("     %.2f %%" % (copy_ok_file_num*100/all_file_len)) # print("\r     %.2f %%" % (copy_ok_file_num*100/all_file_len), end="") if copy_ok_file_num >= all_file_len: break print() if __name__ == '__main__': main()