pythonのプロセス小さなノート(1)

プロセス:データセット上の個々の機能を有するプログラムの活動を実行します。資源の束のコレクションの実装、プロセスがスレッドをもとにしておく必要があります。

  プロセスには、少なくとも1つのスレッドを持っている必要があります。

プロセスとスレッドの違いは?

(1)スレッドはメモリ空間を共有し、メモリのプロセスが独立している
同じプロセスのスレッド間(2)直接通信、2つのプロセスが通信する、中間プロキシを介して達成されなければならない
(3)新しいスレッドを作成し、非常に簡単です親プロセスのクローンである必要が新しいプロセスを作成します
(4)スレッドが制御し、同じプロセス内の他のスレッドの操作ができますが、プロセスは唯一の子プロセスを動作させることができ
、(5)メインスレッドを修正するために、他のスレッドの動作に影響を与える可能性があります子プロセスの親への変更は影響しません

知識のプロセスを:
(1)プロセスを作成
  シングルスレッド、マルチスレッドの作成を簡単に文の削除
インポート・マルチプロセッシング、スレッド、OSの
インポート時
デフ実行(名):
    time.sleep(2)
    印刷( "*************************** ************* ")
    印刷("モジュール名:」、__ name__)
    プリント( "親プロセス:"、os.getppid())
    印刷( "プロセスID:"、os.getpid ())
    プリント( "プロセス情報:"、multiprocessing.current_process())
    プリント( "スレッド情報:"、threading.current_thread())#进程里的主线程

    プリント( "[%のS]プロセスである")%名#进程里创建子线程
    印刷( "****************************************" )
    T = threading.Thread(目標=ハンドル、引数=(名))
    t.start()

DEF(名前)を処理:
    印刷( "[%sは]スレッドが"%名) 
    プリント(threading.get_ident())

__name__ == '__ MAIN__'の場合:

    実行( 'メイン')
    の範囲内のiについての(10):
        P = multiprocessing.Process(対象=実行、引数=(I))
        p.start()

 

(2)プロセス間通信
  A、プロセスキュー

    その後、父、子プロセスは親プロセスのコピーを作成したときに、二つのプロセスの後の場所でのqの順に漬物の基礎となる子プロセスを満たすことができるので、基本的に2つの異なるリストで、インタラクティブなデータを有効にデシリアライズプロセスアウト、。同じデータを変更しないで、単にデータの転送が完了しました。

輸入マルチプロセッシングは、


DEF(q)を実行します。
   q.put([42、なし、 'レオ'])
   印刷( "子プロセス:"、ID(Q))

であれば__name__ == "__ MAIN__":
    Q = multiprocessing.Queue()
    P = multiprocessing.Process(目標=ラン、引数=(Q))
    p.start()
    プリント(q.get())
    プリント( "親プロセス"、ID(Q))
  B、パイプパイ
import multiprocessing
def run(conn):
    
    while True:
        date = conn.recv()
        print("sub process:%s\n"%date)
        conn.send(date)


if __name__ =="__main__":
    parent_conn,sub_conn = multiprocessing.Pipe()
    p = multiprocessing.Process(target=run , args= (sub_conn,))
    p.start()
    while True:
        com = input("from parent>>\n:")
        parent_conn.send(com)
        print("parent process :%s"%parent_conn.recv())    
  C、Manage
import multiprocessing,os

def run(i,d,l,lock):
    lock.acquire()   #锁
    d[os.getpid()] = i
    # l.append(os.getpid())
    for a in range(1000):
        l[0] +=1
    print(l)
    lock.release()

if __name__ =="__main__":
    with multiprocessing.Manager() as manager:
    # 相当于 manager=multiprocessing.Manager()

        d = manager.dict()#生成一个字典,可在多个进程间共享和传递
        l = manager.list(range(5))
        p_list=[]
        lock =multiprocessing.Lock()#进程锁,主要作用是输出屏幕的数据不乱
        for i in range(10):
            p = multiprocessing.Process(target=run , args=(i,d,l,lock,))
            p_list.append(p)
            p.start()

        for i in p_list:  #等待子进程执行完毕
            i.join()

        print(d)
        print(l)
 
(3)进程池
  进程池:进程太多,启动时开销太大,导致系统变慢。需要限制每次启动进程的个数。
  必须先调用close()再调用join()
import multiprocessing,os,time

def run(i):
    time.sleep(2)
    print("[%s] is processing "%os.getpid())
    return i+100,'xxxx'

def Bar(*args):#主进程调用回调
    print('-->exec done:',args)
    print('callback from :',multiprocessing.current_process())

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=5)  #允许进程池里同时放入5个进程

    for i in range(10):#启动了10个进程,同一时间只有5个进程运行
        # pool.apply(func=run , args=(i,))#同步执行,串行
        #pool.apply_async(func=run, args=(i,))  # 异步执行,并行
        pool.apply_async(func=run, args=(i,),callback=Bar)  # 异步执行,并行,callback回调


    print('end')
    pool.close()
    pool.join()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。

  

 
 

おすすめ

転載: www.cnblogs.com/gtq7512/p/11375375.html