マップを使って単純なマルチプロセスプールスクリプトを使用して、結果が順番に実行されたように返されます。Pythonマルチプロセッシングマップで順序付けられていない結果が返される
注 - 「(1-3A-D)」は無視してください。それらは出力の一部ではなく、説明のためにそこにあります。シーケンスマルチプロセッシングが実行されていると仮定します。
import base64
import getpass
import os
from ssh.ssh_module import SSH
from multiprocessing import Pool
username = ''
password = ''
cmd = 'uptime'
def runcommand (server):
print ('Proccess ID: %d' % (os.getpid()))
ssh = SSH (server, username, password)
if ssh.connect():
print (ssh.command (cmd))
ssh.close()
if __name__ == '__main__':
username = input ('Username: ')
# Encode password for SSH
password = getpass.getpass ('Password: ')
password = base64.b64encode (password.encode('utf-8'))
servers = ['192.168.100.1', '192.168.100.2', '192.168.100.3']
with Pool (processes = 2) as pool:
pool.map (runcommand, servers)
出力:あなたが見ることができるように
(virtual) [[email protected] python]$ ./multiprocess.py
Username: spongebob
Password:
(1A) Proccess ID: 24528
(1B) SSH into 192.168.100.1
(2A) Proccess ID: 24529
(2B) SSH into 192.168.100.2
(1C) Successfully logged in!
00:15:24 up 4 days, 8:16, 0 users, load average: 0.12, 0.10, 0.20
(1D) SSH session closed.
(3A) Proccess ID: 24529
(3B) SSH into 192.168.100.3
(2C) Successfully logged in!
00:15:26 up 7 days, 6:17, 0 users, load average: 0.10, 0.11, 0.09
(2D) SSH session closed.
(3C) Successfully logged in!
00:15:47 up 5 days, 6:41, 0 users, load average: 0.14, 0.10, 0.17
(3D) SSH session closed.
、結果は私が注文したことになって 'pool.map' を使用して考えているランダムに返されます。 IP/Systemが最初に実行される順序は重要ではありませんが、出力は正しい順序でなければ意味がありません。どのようにそれを修正するための任意のアイデアは、私は以下の欲求の出力を得ることができますか?
(1A) Proccess ID: 24528
(1B) SSH into 192.168.100.1
(1C) Successfully logged in!
00:15:24 up 4 days, 8:16, 0 users, load average: 0.12, 0.10, 0.20
(1D) SSH session closed.
(2A) Proccess ID: 24529
(2B) SSH into 192.168.100.2
(2C) Successfully logged in!
00:15:26 up 7 days, 6:17, 0 users, load average: 0.10, 0.11, 0.09
(2D) SSH session closed.
(3A) Proccess ID: 24529
(3B) SSH into 192.168.100.3
(3C) Successfully logged in!
00:15:47 up 5 days, 6:41, 0 users, load average: 0.14, 0.10, 0.17
(3D) SSH session closed.
あなたは何を言っているなら)、次に何が(imap_unorderedの目的だが、本当ですか? – dreamzboy
'imap_unordered'は結果の順序を保証しません。 'map'に基づく方法のどれも、与えられた関数の*実行*が正しい順序で現れることを保証しません。それを試してみるには、 'runcommand'関数から' server'パラメータを返してください。 'map'が' imap_unordered'の間に同じ順序でそれらを返すことがわかります。 – noxdafox
あなたが達成しようとしているのは、順序付けられた方法で 'stdout'にログを記録することです。異なるプロセスが論理を実行するのに異なる時間を要する可能性があるためです。 SSHコマンドの実行に別の時間がかかっている場合(たとえば、ネットワークのハックアップ)、process2の後ろにprocess1が記録される可能性があります。参照:https://docs.python.org/2/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes – noxdafox