2016-09-06 101 views
1

我試圖創建一個使用Python的EC2實例的AMI。我需要實現多線程,以便AMI創建可以並行運行。但下面的代碼不起作用。它一次創建單個AMI。多線程在python

模塊1

from Libpy import Libpy 
import boto.ec2 
import sys 
if __name__=='__main__': 

    a = B() 
    Libpy().multithreading(ec2list1,a.create_amibkp(ec2listname,ec2list1)) 

模塊2

import threading 
import time 

class Libpy: 

    def multithreading(l, function): 
     threads = [] 
     for z,v in enumerate(l): 
      dummy = z 
      t = threading.Thread(target=function, args=(v,)) 
      threads.append(t) 
      t.start() 
  1. ec2listname - 包含對他們來說,AMI 創作應該做
  2. ec2list1實例名稱的列表 - 包含實例ID的列表誰應該完成AMI創作
  3. create_amibkp - 爲過濾的實例提供AMI的自定義函數從module1開始,我調用module2來多線程函數,但它不工作。它正在創建一個AMI。 4.B() - 類將返回ec2listname和ec2list1

回答

1

我不能重現你的榜樣,但我已經創建了一個虛擬版本:

import sys 
import threading 
import time 
import random 

random.seed(1) 


class Libpy: 

    def multithreading(self, lst, function): 
     threads = [] 
     for v in lst: 
      t = threading.Thread(target=function, args=(v,)) 
      t.start() 
      threads.append(t) 

     for t in threads: 
      t.join() 


def ami_creation(v): 
    t = random.random() * 4 
    print("creating ami {0}, sleeping {1}".format(v, t)) 
    time.sleep(t) 
    print("ami {0} created ok".format(v)) 

ec2list1 = ["ec2-small", "ec2-medium", "ec2-large"] 
Libpy().multithreading(ec2list1, ami_creation) 

print("All boxes have been created...") 

在上面的例子中,主線程會等到所有的箱子都創建

+0

在我的答案我已經展示瞭如何產生多個線程並行(無觸發延遲),只有當所有線程都完成了他們的業務,主線程將繼續執行,這是因爲在線程中爲t:t.join()'。我建議閱讀關於[線程對象](https://docs.python.org/2/library/threading.html#thread-objects),這將比任何簡短的評論更好地澄清這裏 – BPL

+0

嗨,我是得到下面的錯誤嘗試執行的AMI當備份 BotoServerError:BotoServerError:<?XML版本= 「1.0」 編碼= 「UTF-8」> 503服務不可用 RequestLimitExceeded請求超過上限。 30694d63-d23e-4f28-a892-ab9d958ca0fa 請幫助 – Dave