2017-07-29 53 views
1

我試圖從2個文件多核讀取數據,但執行此代碼後list1list2是空的。多進程從文件讀取

from multiprocessing import Process 

def getfile(fn, out): 
    print("start reading file {}".format(fn)) 
    with open(fn) as file: 
     for line in file: 
      out.append(line) 

if __name__ == '__main__': 
    file1 = [] 
    file2 = [] 
    p1 = Process(target=getfile, args=("100.txt", file1)) 
    p2 = Process(target=getfile, args=("98.txt", file2)) 
    p1.start() 
    p2.start() 

    p1.join() 
    p2.join() 
    print(file1) 
    print(file2) 

如何從文件獲取寫入數據列表或使用多處理可迭代的東西?

+0

看看[這個](https://stackoverflow.com/a/29050564/6111440) –

+0

如果你爲了性能的目的而試圖做到這一點,你需要知道如果兩個文件都駐留在同一物理旋轉磁盤同時讀取它們都不能使整體讀取時間更快,事實上可能會使磁盤讀取速度變慢,因爲磁盤磁頭可能會做額外的搜索。 –

回答

2

當使用多個進程時,請使用QueuesPipes在您的父進程和您生成的進程之間交換數據。

管道直觀地允許您在父進程和子進程之間傳遞數據。

隊列允許您的子進程在隊列中存儲一些數據,以便您的父進程檢索它。

就你而言,隊列是最有意義的,因爲看起來你的父進程不需要在子進程產生後將任何數據傳遞給子進程。

下面是一個文件的示例:

from multiprocessing import Process, Queue 

def getfile(fn, out): 
    with open(fn) as file: 
     for line in file: 
      out.put(line) 

if __name__ == '__main__': 
    file1 = Queue() 
    p1 = Process(target=getfile, args=("100.txt", file1)) 
    p1.start() 
    file1.get() //returns lines of the file 
    p1.join() 

您可以在同一隊列傳遞到兩個過程,只要注意消息可能的情況下,這兩個文件你想分開之間混合的順序每個文件的內容。

+0

哇!謝謝!但如何從2個文件中分離數據? – Entro

+0

創建兩個隊列。將不同的進程傳遞給每個進程,然後將數據分離 –