簡體   English   中英

Python中的線程

[英]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()使用numAlist 因此,在這些定義/方法中,不要說

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM