2016-07-06 161 views
0

我是Python的新手,我努力解決一個問題的努力很大。我有三個程序在運行。其中一個目標是發送數據,另一個接收數據,第三個數據在中間(透明地)工作。第三個問題正在發生,我稱之爲delay_loss.py。Python - Multithreads調用相同的函數並行和獨立運行

它必須先模擬數據包在發送到接收程序之前的延遲。

尋找很多我找到了一個解決方案(多線程),我不知道是最好的解決方案。由於delay_loss.py可以一次接收大量數據包,並且必須爲每個隨機時間選擇一個模擬網絡延遲的時間,所以我必須能夠在選擇隨機時間後將每個數據包發送到接收程序這個數據包獨立於其他數據包。

我想爲此使用多線程,並且我認爲我沒有正確使用它,因爲所有數據包都是在一段時間後同時發送的。線程似乎不會獨立運行send_up()函數。 delay_loss.py的代碼

部分如下圖所示:

import threading 
import time 
from multiprocessing.dummy import Pool as ThreadPool 
... 
pool = ThreadPool(window_size) 
def send_up (pkt, time_delay, id_pkt): 

    time.sleep(time_delay) 

    sock_server.sendto(pkt, (C_IP, C_PORT)) 

def delay_pkt(pkt_recv_raw, rtt, average_delay, id_pkt): 

    x = random.expovariate(1/average_delay)   
    time_delay = rtt/(2+x) 

    pool.apply_async(send_up, [pkt_recv_raw, time_delay, id_pkt]) 

... 
delay_pkt(pkt_recv_raw, rtt, average_delay, id_pkt_recv) 
id_pkt_recv += 1 

如果任何人有什麼我做錯了一些想法。或者只是說,不要採取這種多線程方法來完成這項任務,這將有很大的幫助!

在此先感謝:)

回答

0

我找到了解決我的問題。我沒有必要使用游泳池。 僅使用threading.Timer()函數就簡單多了,如下所示:

t = threading.Timer(time_delay, send_up, [pkt_recv_raw, id_pkt])  
t.start()