[英]Threading in Python
我在python中有兩個定義或方法。 我想同時運行它們。 最初我嘗試使用派生,但是由於孩子保留了父母的內存,因此它正在編寫文件中不需要的多個內容。 所以我切換到線程。
我有類似的東西
import threading
class test(threading.Thread)
def __init__(self,numA, list):
self.__numA=numA # (random number)
self.__list=list #(list)
def run(self):
makelist(self)
makelist2(self)
makelist()
和makelist2()
使用numA
和list
。 因此,在這些定義/方法中,不要說
print list
我說
print self.__list.
在main()中,我創建了一個新的類對象:
x = test()
x.start()
運行程序時,出現屬性錯誤,提示它無法識別__list
或__numA
。
我已經堅持了一段時間。 如果還有另一個更好的方法可以同時運行兩個方法(這些方法根本沒有連接),請告知我並解釋如何。
謝謝。
如果__list和__numA也不是同一類的成員,則它們在makelist和makelist2中將不可見。 雙下划線將使這樣的事情失敗:
>>> class A(object):
... def __init__(self):
... self.__a = 2
...
>>> def f(x):
... print x.__a
...
>>> a = A()
>>> f(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
AttributeError: 'A' object has no attribute '__a'
但是,將__a命名為沒有兩個下划線的東西將是可行的。 那是你看到的嗎?
您可以在python文檔中閱讀有關私有變量的更多信息。
首先,不要將變量的名稱與內置類型或函數(即列表)相同。
其次。 以及其他人指出的問題( __
名稱處理,初始化線程等),如果您打算同時運行makelist和makelist2,那么您做錯了,因為您的run方法仍然會在執行完之后一次執行它們另一個。 您需要在單獨的線程中運行它們,而不是在同一線程中依次運行它們。
第三,“精確的時間”是什么意思? 在(C)Python中使用線程在物理上是不可能的,因為執行將在字節碼級別進行交錯。 其他版本的Python(Jython,IronPython等)可能會在多核系統上完全同時運行,但即使如此,您也無法控制OS調度程序何時啟動每個。
最后,在線程之間共享可變對象是一個壞主意,因為如果兩個線程同時更改數據,則可能(並且將會)發生不可預測的事情。 您需要通過使用鎖或僅傳遞不可變數據或數據副本來防止這種情況。 如果您不小心使用鎖,還會導致自身的問題,例如死鎖。
我想同時運行它們。
您無法使用threading
來執行此操作:Python中的全局解釋器鎖可確保在任何時間只有一個線程可以執行Python代碼(每個sys.getcheckinterval()
字節碼都會切換線程)。 改用multiprocessing
:
from multiprocessing import Process
import os
def info(title):
print title
print 'module name:', __name__
print 'parent process:', os.getppid()
print 'process id:', os.getpid()
def f(name):
info('function f')
print 'hello', name
if __name__ == '__main__':
info('main line')
p = Process(target=f, args=('bob',))
p.start()
p.join()
幾件事:
A)當您覆蓋threading.Thread對象的__init__方法時,您需要自己初始化threading.Thread,這可以通過在__init__函數的末尾放置“ threading.Thread .__ init __(self)”來實現。
B)正如msw指出的那樣,對“ makelist”和“ makelist2”的調用似乎是對全局函數的,這有點違反了線程的目的。 我建議使它們具有測試功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.