この記事では、python に関する関連知識を提供します。主に、プロセス プール作成モジュールやプロセス プール関数など、プロセス プールとプロセス ロックに関連する問題を紹介します。見てみましょう。皆様のお役に立てれば幸いです。
#推奨される学習: プロセス プールプロセス プールとはプロセスに関する問題については前章で述べましたが、プロセスを作成しすぎるとリソースを大量に消費します。この状況を回避するにはプロセス数を修正する必要があり、このときプロセス プールの助けが必要です。 プロセス プールは、あらかじめ一定数のプロセスが作成されているプールと考えることができます。下の図を参照してください。概要 | パラメータ | 戻り値 | |
---|---|---|---|
プロセス プールの作成 | Processcount | プロセス プール オブジェクト |
パラメータ | 戻り値 | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
func, args | None | # #close | |||||||||||||
None | None | join | |||||||||||||
なし | なし |
apply_async 関数のデモ ケース次に、プロセス プールの使用を練習するためのスクリプトを Pycharm で作成します。 サンプルコードは以下のとおりです: # coding:utf-8import osimport timeimport multiprocessingdef work(count): # 定义一个 work 函数,打印输出 每次执行的次数 与 该次数的进程号 print('\'work\' 函数 第 {} 次执行,进程号为 {}'.format(count, os.getpid())) time.sleep(3) # print('********')if __name__ == '__main__': pool = multiprocessing.Pool(3) # 定义进程池的进程数量,同一时间每次执行最多3个进程 for i in range(21): pool.apply_async(func=work, args=(i,)) # 传入的参数是元组,因为我们只有一个 i 参数,所以我们要写成 args=(i,) time.sleep(15) # 这里的休眠时间是必须要加上的,否则我们的进程池还未运行,主进程就已经运行结束,对应的进程池也会关闭。 ログイン後にコピー 上の図を見ると、毎回 3 つのプロセスが同時に実行されていることがわかります。各プロセスのプロセス番号は異なりますが、よく見ると次のことがわかります。同じプロセス番号が存在します。これは、プロセス プールが再利用されていることを示します。これは、上で紹介したことを証明しており、プロセス プール内のプロセスは閉じられず、繰り返し使用できます。
Close 関数と join 関数のデモ
サンプル コードは次のとおりです。 # coding:utf-8import osimport timeimport multiprocessingdef work(count): # 定义一个 work 函数,打印输出 每次执行的次数 与 该次数的进程号 print('\'work\' 函数 第 {} 次执行,进程号为 {}'.format(count, os.getpid())) time.sleep(3) # print('********')if __name__ == '__main__': pool = multiprocessing.Pool(3) # 定义进程池的进程数量,同一时间每次执行最多3个进程 for i in range(21): pool.apply_async(func=work, args=(i,)) # 传入的参数是元组,因为我们只有一个 i 参数,所以我们要写成 args=(i,) # time.sleep(15) pool.close() pool.join() ログイン後にコピー 実行結果は次のとおりです。 上のアニメーション、 PS: メインプロセスが常に実行され、終了しない場合。そうすれば、 後からWEB開発を学んだ後は、メインプロセスから抜け出さずに作業するのが当たり前です。長時間実行する必要があり、閉じられないタスクもありますが、1 回限りの実行スクリプトしかない場合は、
示例代码如下: # coding:utf-8import osimport timeimport multiprocessingdef work(count): # 定义一个 work 函数,打印输出 每次执行的次数 与 该次数的进程号 print('\'work\' 函数 第 {} 次执行,进程号为 {}'.format(count, os.getpid())) time.sleep(3) return '\'work\' 函数 result 返回值为:{}, 进程ID为:{}'.format(count, os.getpid())if __name__ == '__main__': pool = multiprocessing.Pool(3) # 定义进程池的进程数量,同一时间每次执行最多3个进程 results = [] for i in range(21): result = pool.apply_async(func=work, args=(i,)) # 传入的参数是元组,因为我们只有一个 i 参数,所以我们要写成 args=(i,) results.append(result) for result in results: print(result.get()) # 可以通过这个方式返回 apply_async 的返回值, # 通过这种方式也不再需要 使用 close()、join() 函数就可以正常执行。 # time.sleep(15) # 这里的休眠时间是必须要加上的,否则我们的进程池还未运行,主进程就已经运行结束,对应的进程池也会关闭。 # pool.close() # pool.join() ログイン後にコピー 运行结果如下: 从运行结果可以看出,首先 这些都是主要依赖于 进程锁进程锁的概念锁:大家都知道,我们可以给一个大门上锁。 结合这个场景来举一个例子:比如现在有多个进程同时冲向一个 而 进程锁的加锁与解锁进程锁的使用方法:
代码示例如下: # coding:utf-8import osimport timeimport multiprocessingdef work(count, lock): # 定义一个 work 函数,打印输出 每次执行的次数 与 该次数的进程号,增加线程锁。 lock.acquire() # 上锁 print('\'work\' 函数 第 {} 次执行,进程号为 {}'.format(count, os.getpid())) time.sleep(3) lock.release() # 解锁 return '\'work\' 函数 result 返回值为:{}, 进程ID为:{}'.format(count, os.getpid())if __name__ == '__main__': pool = multiprocessing.Pool(3) # 定义进程池的进程数量,同一时间每次执行最多3个进程 manager = multiprocessing.Manager() lock = manager.Lock() results = [] for i in range(21): result = pool.apply_async(func=work, args=(i, lock)) # 传入的参数是元组,因为我们只有一个 i 参数,所以我们要写成 args=(i,) # results.append(result) # time.sleep(15) # 这里的休眠时间是必须要加上的,否则我们的进程池还未运行,主进程就已经运行结束,对应的进程池也会关闭。 pool.close() pool.join() ログイン後にコピー 执行结果如下: 从上图中,可以看到每一次只有一个任务会被执行。由于每一个进程会被阻塞 3秒钟,所以我们的进程执行的非常慢。这是因为每一个进程进入到 work() 函数中,都会执行 其实进程锁还有很多种方法,在
因为 推荐学习:python视频教程 |
以上がPython プロセス プールとプロセス ロックの詳細については、こちらをご覧ください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。