2017-05-17 2 views
0

나는 순차적으로 실행 된 것처럼 결과를 얻기 위해 map을 사용하는 간단한 다중 프로세스 풀 스크립트를 가지고 있습니다.파이썬 다중 처리 맵은 순서가없는 결과를 반환합니다.

주 - "(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/시스템이 실행되는 순서는 중요하지 않지만 출력은 올바른 순서로 이루어져야 합리적입니다. 그것을 고칠 수있는 방법에 대한 아이디어는 아래에 원하는 출력을 얻을 수 있습니까?

(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' 기반 메소드는 주어진 함수의 * 실행 *이 올바른 순서로 나타나지 않도록 보장하지 않습니다. 이것을 시험해 보려면'runcommand' 함수에서'server' 매개 변수를 반환하십시오. 'map'은'imap_unordered'가 아닌 동안 같은 순서로 돌려줍니다. – noxdafox

+0

당신이 달성하고자하는 것은'stdout'에 순서대로 기록하는 것입니다. 이것은 다른 프로세스가 로직을 실행하기 위해 다른 시간이 걸리기 때문에 불가능합니다. SSH 명령이 다른 시간 (예 : 네트워크 딸꾹질)을 취하는 경우 process2가 process2 다음에 기록되도록 할 가능성이 높습니다. https://docs.python.org/2/howto/logging-cookbook.html#logging-to-a-single-file-from-multipleprocesses를 참조하십시오. – 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.