3 回答
TA貢獻1856條經驗 獲得超17個贊
我輸入了一個非常簡單的示例,希望它對您來說是一個很好的入門者:
# this is important
from thread import start_new_thread, allocate_lock
# this is for show
from time import sleep
from random import randint
# global receiver
myresults = []
counter = 0
# lock that protects "myresults"
lock = allocate_lock()
#lock that protects "counter"
lock2 = allocate_lock()
# this does the url processing
def retrieve(url):
# sleep for 4-10s to simulate processing time
sleep(randint(4,10))
print "Done handling %s" % url
# thread safe retrieve
def retrieveLocking(url):
// global variables
global myresults, counter
// random processing time
sleep(randint(4,10))
print "[LOCKING] Done handling %s" % url
// request access to myresults' lock
lock.acquire()
myresults.append(url)
lock.release() // release lock!
// request access to counter's lock
lock2.acquire()
counter += 1
lock2.release() // release lock!
# here goes your main loop
start_new_thread(retrieve, ("A",))
start_new_thread(retrieve, ("B",))
start_new_thread(retrieve, ("C",))
# using locking
start_new_thread(retrieveLocking, ("A",))
start_new_thread(retrieveLocking, ("B",))
start_new_thread(retrieveLocking, ("C",))
在這種情況下,可以通過全局變量來處理查詢結果。有更多復雜的方法可以從線程tho'中檢索數據。
如果您使用全局變量解決方案,則添加了鎖。在并發編程中,當多個線程希望同時訪問同一資源時,可能會發生“競賽條件”。為了防止覆蓋這些變量的舊狀態,鎖可以保護該資源。僅在釋放鎖定之后,才允許下一個線程訪問資源。等待發布會在這里為您服務:)
我希望這有幫助 :)
//編輯:如果您以這種方式解決問題,實際上并沒有確定所有線程是否終止的方法。因此,如果您要堅持使用此解決方案,請添加一個由每個線程增加的計數器(用鎖保護計數器)并進行繁忙等待(無限循環,直到到達計數器)。這確實是不好的做法。但是,如果您想更詳細地編寫代碼,事情會變得有些復雜,我認為您是并發編程的新手:
while True:
lock2.acquire()
if counter == totalthreads: # in this case 3
lock2.release()
break
lock2.release()
print "Done! %r" % myresults
TA貢獻1803條經驗 獲得超3個贊
好的,所以基本上您想運行一個產生幾個線程的腳本,每個線程都嘗試到達一個IP,對嗎?
產生一個線程真的很容易:
import threading
thread = threading.Thread(target=target_function, args(argument1, argument2,...))
thread.start()
在這種情況下,target_function應該是您的ip檢查功能。
線程如何將其結果報告回主線程有幾種方法。我猜想這應該是一個不會經常使用的簡單腳本,所以為什么不簡單地使用dict,將ips作為鍵,將結果作為值。
添加回答
舉報
