2017-09-25 30 views
-1

因此,在過去的這些日子裏,我一直在試圖弄清楚如何開始接觸線程,並最終實現它的工作。我現在面臨的問題是我希望他們同時運行。我聽到不同的事情,如GIL不會工作。有人說,它可以與multiprocessing等等。但我轉過來看看它是否有可能和說什麼這樣做?Python - 將線程轉換爲多處理器

基本上我的代碼看起來現在是這樣的:

代碼與線程

def start(config): 
    NameUrl = config["Url"] 
    myNote = config["My-Note"] 
    checkoutNames(Nameurl, MyNote) 

if __name__ == '__main__': 
    with open('config.json', 'r', encoding='UTF-8') as json_data: 
     config = json.load(json_data) 
    threads = [] 
    for i, e in enumerate(config): 
     threads.append(threading.Thread(target=start, args=(config[i] or e))) 

正如你可以看到if __name__ == '__main__':這就是線程是在這一刻。然而,這個時候做的是,它首先執行線程1,當它完成後,轉向線程2並繼續這樣做,如果甚至有可能,我的願望是將它同時/同時轉換爲線程?

編輯

CODE

if __name__ == '__main__': 
    with open('config.json', 'r', encoding='UTF-8') as json_data: 
     config = json.load(json_data) 
    jobs = [] 
    for i, e in enumerate(config): 
     c = (config[i] or e) 
     p = multiprocessing.Process(target=start, args=(c)) 
     jobs.append(p) 
     p.start() 

錯誤IAM與上面的代碼獲得:

[<Process(Process-1, initial)>] 
<Process(Process-1, initial)> 
{'Email': '[email protected]', 'PersonNumber': '4234', 'ZipCode': '1241234', 'Name': 'Guess', 'LastName': 'TheyKnow'} 
[<Process(Process-1, started)>, <Process(Process-2, initial)>] 
<Process(Process-2, initial)> 
{'Email': '[email protected]', 'PersonNumber': '1234', 'ZipCode': '56431', 'Name': 'Stack', 'LastName': 'Overflow'} 
Process Process-1: 
Traceback (most recent call last): 
    File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 249, in _bootstrap 
    self.run() 
    File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
TypeError: start() takes 1 positional argument but 16 were given 
Process Process-2: 
Traceback (most recent call last): 
    File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 249, in _bootstrap 
    self.run() 
    File "C:\Users\AppData\Local\Programs\Python\Python36\lib\multiprocessing\process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
TypeError: start() takes 1 positional argument but 16 were given 
+0

是,多重同時工作,只要你的CPU有核心來處理它。嘗試使用'import multiprocessing'和'multiprocessing.Process',看看你能否得到它的工作。 – quamrana

+0

如果您的實際工作歸結爲使用'requests'(或等效)來獲取數據,那麼您應該對GIL沒有任何問題。 GIL隻影響進行實際計算的CPU密集型代碼。你正在解決什麼具體問題? – user4815162342

+0

@quamrana現在唯一的問題是將'''threads.append(threading.Thread(target = start,args =(config [i] or e)))''''轉換爲多處理。你有什麼想法嗎?它只是改變threading.Thread到'''multiprocessing.Process'''? – WeInThis

回答

2

我認爲你需要修復的args參數:

... 
jobs = [] 
for i, e in enumerate(config): 
    c = (config[i] or e) 
    p = multiprocessing.Process(target=start, args=(c,)) 
    jobs.append(p) 
    p.start() 

注意在args參數使用的語法:

args=(c,)) # <=== (c,) means that we are assigning the tuple (c,) to args 
      # which gets translated into start(c) 
+0

它確實給出了相同的結果。但是''''args =(c,))'''這個逗號給我一個錯誤,說它找不到'''NameError:name'i'沒有被定義',但是當我刪除逗號後* C *它給了我另一個錯誤,說'self._target(* self._args,** self._kwargs) TypeError:start()需要1個位置參數,但是有16個被給出了''' 但是程序仍然即使錯誤也會在後臺運行......而且它又一次運行1和1。 – WeInThis

+0

這是不可能的。你必須有其他的代碼運行。 – quamrana

+0

我現在把錯誤添加到線程中。因爲它太長,所以在這裏發佈 – WeInThis