簡體   English   中英

如何在我的 python 腳本中實現多處理?

[英]How to implement multiprocessing in my python script?

所以我想做的事情是讓多個核心處理一些東西......

我有一個 py 腳本,它基本上為我的 ML 和 DL 模型創建了一個特征向量。 現在我正在做的是我獲取一個 txt 文件,我將它與我在運行時初始化的列表進行比較。 因此,代碼獲取 txt 中的第一行並檢查該行在唯一列表中的位置以及在該位置,它在另一個列表中 +1。 然后將該列表附加到另一個列表,然后將其寫入 csv 文件,但這發生在執行結束時。 現在沒有線程,我能夠在 500 毫秒到 1.5 秒左右處理 1 個文件。 當我在我的系統上打開活動監視器時,我可以看到一次,任何 1 個核心都將被固定為 100%。 但是當我做多線程的事情時,所有 10 個內核將只占 10% 到 20% 左右。 與我的非線程內容相比,執行速度並沒有那么快。

我有 6464 個文件,我的系統是 i5 8300H(4 核)或 i9 10900(10 核)

在 find_files() 中,我基本上編寫了腳本來查找我需要的文件。 一些變量被初始化。 我只是沒有把它放在這里使代碼變得復雜。 現在最后,您可以看到一個線程輔助函數,它基本上用於將調用划分為多個線程。

def find_files():
internal_count = 0

output_path = script_path + "/output"
fam_dirs = os.listdir(output_path)
for fam_dir in fam_dirs:
    if fam_dir in malware_families:
        files = os.listdir(output_path + "/" + fam_dir + "/")
        for file in files:
            file_path = output_path + "/" + fam_dir + "/" + file
            internal_count += 1
            thread_helper(file_path, file, fam_dir, internal_count)

在這里,您可以看到線程助手采用“計數”參數並將調用划分給特定線程以平衡負載。 我什至也嘗試過 thread.join() 。 但同樣的問題。

def thread_helper(file_path, file, fam_dir, count):
if count % 4 == 0:
    t4 = threading.Thread(target=generate_feature_vector, args=(file_path, file, fam_dir))
    t4.start()
elif count % 3 == 0:
    t3 = threading.Thread(target=generate_feature_vector, args=(file_path, file, fam_dir))
    t3.start()
if count % 2 == 0:
    t2 = threading.Thread(target=generate_feature_vector, args=(file_path, file, fam_dir))
    t2.start()
else:
    t1 = threading.Thread(target=generate_feature_vector, args=(file_path, file, fam_dir))
    t1.start()


# wait until threads are completely executed
# t1.join()
# t2.join()
# t3.join()
# t4.join()

所以在這個函數中,我基本上取一個文件,打開它,一行一行地取輸入行,看看它在唯一列表中的位置,然后 I +1 特征向量列表中與唯一列表相對應的位置的值。

def generate_feature_vector(path, file_name, family):
try:
    with open(path, 'r') as file:
        lines = file.read()
        lines = lines.split("\n")
        
        feature_vector = list()

        # Init feature_vector to 0 with the length of the unique list of that feature
        for i in range(len(feature_ls)):
            feature_vector.append([0] * len(unique_ls[i]))
        

        
        # +1 the value in the cell corresponding to the file_row and feature_name_column and append family name
        for line in lines:
            for i in range( len(feature_ls) ):
                if line in unique_ls[i]:
                    feature_vector[i][ unique_ls[i].index(line) ] += 1
                feature_vector[i][ len(feature_vector[i])-1 ] = family

我不確定我在哪里搞砸了。 那么你們能幫我將負載分配給多個 CPU 內核嗎? 如果我在問這個問題時弄亂了術語,也請糾正我....

由於 python 的 GIL,一次只執行一個線程,使threading只對 I/O 受限的應用程序有效,而不是 CPU 受限的應用程序,比如你的。

為了使您的程序並行化,我建議使用multiprocessing模塊,它在使用上與threading非常相似,但實現了真正的並行性。

正如 Joao Donasolo 所說,我嘗試了多處理。 而這整段時間,我只是看錯了地方。 我把多處理誤認為是多線程。 對於我的具體問題,多處理模塊幫助了我。 我還沒有運行和基准測試來比較這些,但是一旦我能夠進行基准測試,我就會在這里更新統計數據和代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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