2012-05-15 34 views
12

Có cách nào để tự động sửa đổi máy chủ giữa nhiều tác vụ song song không? Đây là những gì tôi có cho đến nay.Máy chủ động và nhiệm vụ song song với thư viện Fabric

def init_hosts(): 
    env.hosts = [host1,host2,host3,host4] 

@parallel 
def task_1(): 
    if condition is False: 
     env.hosts.remove(env.host) 

@parallel 
def task_2(): 
    run('uname -s') 

Rõ ràng là tôi đang thiếu một số env paramenters, nhưng tôi chỉ muốn task_2 để chạy trên máy mà đáp ứng các điều kiện trong task_1. Nó xuất hiện danh sách máy chủ của task_2 được khởi tạo khi khởi động, bởi vì nó đang chạy trên tất cả các máy chủ trong danh sách env.hosts ban đầu được xác định trong init_hosts(). Tôi cũng đã cố gắng tự động sửa đổi và xây dựng các roledef, nhưng cũng có kết quả tương tự.

Chỉnh sửa: Ngoài ra, có cách nào để thiết lập hàng đợi thực hiện song song sao cho nhiều tác vụ song song được thực thi song song chứ không phải tuần tự?

Edit: Tôi quản lý để có được kết quả cuối cùng mong muốn của tôi bằng cách có mỗi nhiệm vụ đầu ra trở lại, và phân tích các kết quả để xây dựng một danh sách máy chủ mới để vượt qua để thực hiện():

def init_hosts(): 
    env.hosts = [host1,host2,host3,host4] 

@parallel 
def task_1(): 
    if condition is False: 
     return False 
    else: 
     return True 

@parallel 
def task_2(): 
    run('uname -s') 

def run_tests(): 
    results = execute(task_1) 
    successful_hosts = [k for k in results.iterkeys() if results[k]] 
    execute(test_2, hosts=successful_hosts) 

này hoạt động, nhưng nó tổng số vì nhiều lý do. Có cách nào tốt hơn?

Trả lời

3

Thực hiện song song sử dụng dĩa, và như vậy không chia sẻ (trở lại) thay đổi trạng thái. Vì vậy, thay đổi biến env trong một tác vụ đang chạy song song, không ảnh hưởng đến bất kỳ cá thể nào khác của tác vụ đó đang chạy, cũng không thay đổi bất kỳ thứ gì được đặt toàn cục trước khi nó được gọi.

Nếu tất cả nhiệm vụ_1 đang thực hiện là kiểm tra, tại sao không chỉ kết hợp logic này vào task_2?

Các vấn đề liên quan