我有一個代碼庫,我正在尋找拆分並添加到使用線程,但我是如何處理它相對較新。請在閱讀進一步的尊重之前,我不希望重寫這段代碼,並在問題解決後將其拋回給我。我更願意把某個人指向正確的方向,而不是爲我解決問題。我沒有很好地學習。將python程序轉換爲線程應用程序的過程?
全功能代碼庫爲here - 它需要通過easy_install安裝的mechanize和beautifulsoup庫。
我把所有的函數都分開了,並儘量保持代碼儘可能乾淨(我確信在那裏有一些優化,我會得到擴展,但主要問題是如何線穿過這個。
我的最終目標是要打包成一個線程這一點,然後共享其他瀏覽器初始化對象之間的cookies爲了做其他的事情,而我原來的代碼運行「中背景」。
我已經如此嘗試:
class Recon(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
#Packed the stuff above my original while loop in here, minus functions.
def run(self):
#Packed my code past the while loop in here.
somevar = Recon()
somevar.start()
問題我遇到的是,一旦我運行該程序,它將運行init中的內容,但之後它只是坐在那裏凍結在我身上。沒有追蹤,沒有錯誤,只是沒有做任何事情,甚至不會將我的命令提示返回到我的控制。
我可以只是得到一些提示,或者如何轉換的一般流程?我感到不知所措,並刪除了我正在嘗試的代碼,所以我沒有這個例子,但是我需要預先加入「自我」。我所有的變數?我需要將我的變量定義爲全局嗎?
這是我在嘗試將腳本轉換爲使用threading後遇到的問題的複製。
你所有的假設都是正確的;我正在嘗試引入線程,爲將來只能共享列表和cookiejar對象的代碼做準備。我的想法是,我將用一個線程來抓取數據,並在另一個線程中處理該數據(但被訪問的數據將永遠不會被同時訪問) 如果我調用init,並運行...如果我的init正在調用原始輸入,Python會在等待init輸入時運行我的run函數嗎?或者init是否必須先完成? – ThantiK 2010-02-28 04:39:19
@ThantiK,Python中的所有I/O函數「放棄GIL」(全局解釋器鎖),以便其他線程(使用CPU任務而不是I/O)可以接管。但是線程子類的'__init__'運行在實例化它的線程中(主線程在正常情況下,特別是在你的情況下) - 新線程只在'start'方法調用時產生,它是什麼運行只是「運行」方法。 – 2010-02-28 05:03:57
這是我的轉換的結果,SEEMS現在工作正常:http://pastebin.com/Pb582aF3任何幫助使它更清潔或任何批評是受歡迎的;) – ThantiK 2010-02-28 05:06:03