Bạn sẽ cần phải đặt các cuộc gọi thành các chuỗi riêng biệt (hoặc các quá trình, nhưng điều đó sẽ quá mức cần thiết), do đó yêu cầu mã phải ở trong một hàm (đó là một ý tưởng hay: không có mã đáng kể ở cấp cao nhất của mô-đun).
Ví dụ:
import sys, os, string, threading
import paramiko
cmd = "grep -h 'king' /opt/data/horror_20100810*"
outlock = threading.Lock()
def workon(host):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username='xy', password='xy')
stdin, stdout, stderr = ssh.exec_command(cmd)
stdin.write('xy\n')
stdin.flush()
with outlock:
print stdout.readlines()
def main():
hosts = ['10.10.3.10', '10.10.4.12', '10.10.2.15', ] # etc
threads = []
for h in hosts:
t = threading.Thread(target=workon, args=(h,))
t.start()
threads.append(t)
for t in threads:
t.join()
main()
Nếu bạn có nhiều hơn năm host, tôi sẽ khuyên bạn sử dụng thay vì một "hồ bơi thread" kiến trúc và một danh sách các đơn vị làm việc. Nhưng, chỉ trong năm, nó đơn giản hơn để dính vào mô hình "chuyên dụng thread" (đặc biệt là kể từ khi không có hồ bơi thread trong thư viện chuẩn, vì vậy bạn sẽ cần một gói bên thứ ba như threadpool ... hoặc rất nhiều tùy chỉnh tinh tế mã của riêng bạn tất nhiên ;-).
Nguồn
2010-08-14 23:03:28
Tôi đã loại bỏ 1 máy, vì vậy tôi chỉ cần 4. Tôi quên đề cập đến tất cả dữ liệu sẽ được xử lý sau này trong kịch bản và tôi có thể hiểu mã của bạn (I m PyN00b)) nó sẽ in tất cả dữ liệu từ tất cả các máy cùng một lúc, nhưng làm thế nào tôi có thể xử lý dữ liệu chỉ từ một máy chủ sau đó? Và tất cả các máy chủ có pass khác nhau vì vậy tôi có thể đặt tất cả trong workon()? Ty để phát lại nhanh Alex. Kính trọng – Whit3H0rse
@konjo, bạn có thể thực hiện xử lý dữ liệu trong chuỗi chỉ lấy dữ liệu - thay vào đó tôi in 'in', chỉ vì đó là những gì bạn đã làm trong câu hỏi của mình. Việc xử lý tất nhiên có thể liên quan đến việc kiểm tra giá trị của 'máy chủ', nếu bạn cần thực hiện xử lý khác nhau cho các giá trị khác nhau của chúng. Hoặc, bạn có thể viết nhiều hàm để sử dụng như 'target =' trong các chủ đề của bạn: không có ràng buộc rằng tất cả các luồng phải chạy cùng một hàm! –
Oke tôi đã có thể grep tất cả 4 máy, nhưng bây giờ tất cả dữ liệu được sáp nhập. Làm cách nào tôi có thể trích xuất dữ liệu từ từng máy chủ riêng lẻ, bạn có thể đưa ra ví dụ về mi không, vui lòng mở rộng ví dụ ở trên? Kính trọng – Whit3H0rse