2017-05-17 13 views
0

マップを使って単純なマルチプロセスプールスクリプトを使用して、結果が順番に実行されたように返されます。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. 

答えて

0

Pool.mapは、彼らが予定されていたのと同じ順序で結果を返しますが、それらが同じ順序で実行されることを保証しません。

順次実行はmultiprocessingを使用する目的を無効にします。順番に実行する必要がある場合は、mapを使用してください。

+0

あなたは何を言っているなら)、次に何が(imap_unorderedの目的だが、本当ですか? – dreamzboy

+0

'imap_unordered'は結果の順序を保証しません。 'map'に基づく方法のどれも、与えられた関数の*実行*が正しい順序で現れることを保証しません。それを試してみるには、 'runco​​mmand'関数から' server'パラメータを返してください。 'map'が' imap_unordered'の間に同じ順序でそれらを返すことがわかります。 – noxdafox

+0

あなたが達成しようとしているのは、順序付けられた方法で 'stdout'にログを記録することです。異なるプロセスが論理を実行するのに異なる時間を要する可能性があるためです。 SSHコマンドの実行に別の時間がかかっている場合(たとえば、ネットワークのハックアップ)、process2の後ろにprocess1が記録される可能性があります。参照:https://docs.python.org/2/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes – noxdafox

0

私は、SSHクラス内のメッセージを削除し、それを呼び出し元に移動することによって、目的の出力を達成することができました。 .join()を使ってメッセージシーケンスを構築するのは問題です。それは最上級ではないが、今注文されている。

import base64 
import getpass 
import os 

from cet.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) 
    s1 = 'SSH into %s' % server 
    if ssh.connect(): 
     s2 = 'Successfully logged in!' 
     s3 = ssh.command (cmd) 

     ssh.close() 
     s4 = 'SSH session closed.\n' 

     output = '\n'.join ([s1, s2, s3, s4]) 

     return output 
    else: 
     pass 


if __name__ == '__main__': 

    servers = ['192.168.100.1', '192.168.100.2', '192.168.100.3'] 

    username = input ('Username: ') 
    # Encode password for SSH 
    password = getpass.getpass ('Password: ') 
    password = base64.b64encode (password.encode('utf-8')) 

    with Pool (processes = 4) as pool: 
     results = pool.map (runcommand, servers) 

    for i in results: 
     print (i) 

出力

(virtual) [[email protected] python]$ ./multiprocess.py 
Username: spongebob 
Password: 
Proccess ID: 40764 
Proccess ID: 40763 
Proccess ID: 40766 
SSH into 192.168.100.1 
Successfully logged in! 
17:25:33 up 8 days, 23:51, 0 users, load average: 3.04, 2.05, 1.43 

SSH session closed. 

SSH into 192.168.100.2 
Successfully logged in! 
17:25:17 up 2 days, 1:26, 0 users, load average: 0.44, 0.42, 0.72 

SSH session closed. 

SSH into 192.168.100.3 
Successfully logged in! 
17:25:15 up 8 days, 23:27, 0 users, load average: 2.37, 2.35, 2.03 

SSH session closed. 
関連する問題