亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python:如何在網絡中使用線程?

Python:如何在網絡中使用線程?

慕妹3146593 2021-03-19 14:10:17
我正在嘗試制作一個程序,該程序將搜索隨機ID來查找網站標題。我做了一個單線程函數,但是它非常慢,因為如果沒有隨機IP的服務器,它必須等待超時。我不了解線程,有人可以幫助我嗎?關于線程有什么好的教程嗎?也許是一個有關如何使ips主線程和另外幾個線程檢查ips的示例。
查看完整描述

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


查看完整回答
反對 回復 2021-03-30
?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

好的,所以基本上您想運行一個產生幾個線程的腳本,每個線程都嘗試到達一個IP,對嗎?


產生一個線程真的很容易:


import threading

thread = threading.Thread(target=target_function, args(argument1, argument2,...))  

thread.start()

在這種情況下,target_function應該是您的ip檢查功能。


線程如何將其結果報告回主線程有幾種方法。我猜想這應該是一個不會經常使用的簡單腳本,所以為什么不簡單地使用dict,將ips作為鍵,將結果作為值。


查看完整回答
反對 回復 2021-03-30
  • 3 回答
  • 0 關注
  • 302 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號