2016-03-11 57 views
0

我有一個collect_data方法從另一種方法create調用。我想異步調用這個collect_data方法,因爲用戶不需要等待函數create的響應。調用方法異步從另一種方法

def create(obj): 
    "do something in database" 
    "return ID for newly created data in DB" 
    collect_data(obj, newly_created_id) 
    return newly_created_id 

def collect_data(obj, newly_created_id): 
    "collect data from other methods." 
    "Put the data in MQ." 

所以,我希望異步運行此COLLECT_DATA,使用戶不必等待newly_created_id直到數據被放在ActiveMQ的。

我嘗試了多處理,如下所示。

import multiprocessing as mp 
def create(obj): 
    pool = mp.Pool() 
    "do something in database" 
    "return ID for newly created data in DB" 
    pool.apply_async(collect_data, args=(obj, newly_created_id)) 
    return newly_created_id 

但是,這似乎並不是異步運行。爲了測試我在collect_data中插入了睡眠2分鐘。函數create不會立即返回newly_created_id。

有人可以請幫忙。

+0

嘗試'map_async' – quikst3r

+1

因爲它是現在(+休眠)異步事情發生之前輸出的ID,它返回即刻。 – bereal

+0

@Bereal,我需要在哪裏添加睡眠?你可以解釋嗎 ? –

回答

1
from multiprocessing import Pool 
import time 
import random 

class DATA: 
    def __init__(self, obj, new_id): 
     self.obj = obj 
     self.new_id = new_id 

def collect_id(data): 
    print 'collecting data for obj {0} with id {1}'.format(data.obj, data.new_id) 

def create(obj): 
    pool = Pool() 
    # "do something in database" 
    # "return ID for newly created data in DB" 
    newly_created_id = int(random.random()*10) 
    data = DATA(obj, newly_created_id) 
    r = pool.map_async(collect_id, [data]) 
    return newly_created_id 


new_id = create({'some':'object'}) 
print "new id: {0}".format(new_id) 

你會看到它,它輸出,它的收集數據,顯示在後臺

+0

感謝quikst3r,這也適用。 –

相關問題