簡體   English   中英

Python 在多處理期間更新數據庫

[英]Python update Database during multiprocessing

我正在使用多處理並行執行作業,我的目標是使用多 CPU 核心,因此我選擇了多處理模塊而不是線程模塊

現在我有了方法,它使用子進程模塊來執行 linux shell 命令,我需要過濾它並將結果更新到數據庫。

對於每個線程,子進程執行時間可能不同,有些線程輸入執行時間可能是 10 秒,其他可能是 15 秒。

我關心的是總是會得到相同的線程執行結果或不同的線程執行結果,

或者我必須使用鎖定機制,如果是,您能否提供適合我要求的示例

下面是示例代碼:

#!/usr/bin/env python
import json
from subprocess import check_output
import multiprocessing


class Test:

    # Convert bytes to UTF-8 string
    @staticmethod
    def bytes_to_string(string_convert):
        if not isinstance(string_convert, bytes) and isinstance(string_convert, str):
            return string_convert, True
        elif isinstance(string_convert, bytes):
            string_convert = string_convert.decode("utf-8")
        else:
            print("Passed in non-byte type to convert to string: {0}".format(string_convert))
            return "", False

        return string_convert, True

    # Execute commands in Linux shell
    @staticmethod
    def command_output(command):
        try:
            output = check_output(command)
        except Exception as e:
            return e, False

        output, state = Test.bytes_to_string(output)

        return output, True

    @staticmethod
    def run_multi(num):

        test_result, success = Test.command_output(["curl", "-sb", "-H", "Accept: application/json", "http://127.0.0.1:5500/stores"])
        out = json.loads(test_result)
        #Update Database is safer here or i need to use any locks




if __name__ == '__main__':
    test = Test()
    input_list = list(range(0, 1000))
    numberOfThreads = 100
    p = multiprocessing.Pool(numberOfThreads)

    p.map(test.run_multi, input_list)
    p.close()
    p.join()

取決於您在數據庫中進行的更新類型...

如果它是一個完整的數據庫,它將有自己的鎖定機制; 您需要使用它們,但除此之外,它已經被設計為處理並發訪問。

例如,如果更新涉及插入一行,您可以這樣做; 數據庫將以所有行結束,每行都恰好一次。

暫無
暫無

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

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