簡體   English   中英

使用python在sqlite數據庫上並發

[英]Concurrency on sqlite database using python

有一個我要處理的數據列表。 但是,我需要使用多個實例處理數據以提高效率。

每次每個實例應取出一個項目,將其從列表中刪除,並使用某些程序對其進行處理。

首先,我嘗試將列表存儲在sqlite數據庫中,但是sqlite允許多個讀取鎖,這意味着多個實例可能會從數據庫中獲取同一項目。

有什么方法可以使每個實例獲得一個唯一的項目進行處理? 如果需要,我可以使用其他數據結構(其他數據庫或只是文件)。

順便說一句,在執行cursor.execute(delete_query)之后,有沒有辦法檢查DELETE操作是否成功?

據我所知,您將需要啟動python解釋器的多個實例以與python(或至少多個執行進程)獲得真正的並發性,因此您可以:

  • 使1個經紀人進程告訴其他人允許他們記錄的記錄(例如通過0mq之類的東西),但這可能實際上使您的經紀人成為瓶頸。
  • 如果您的數據易於分割(例如,主鍵的升序編號),則按進程將數據庫的各個部分分開。

之類的東西greenlets任務蕾真的執行一前一后,他們轉的真快,由於這樣的事實,他們沒有真正的線程/進程的開銷,但他們不是真正的並行執行。

db中的另一個字段作為標志如何處理(例如,PROCESSING,UNPROCESSED,PROCESSED)?

最簡單的方法是在單個流程中生成項目,並將其傳遞給多個工作流程,例如:

from multiprocessing import Pool

def process(item):
    pass # executed in worker processes

def main():
    p = Pool() # use all available CPUs
    for result in p.imap_unordered(process, open('items.txt')):
        pass

if __name__=='__main__':
   main()

為什么不從數據庫中讀取所有項目並將它們放在隊列中呢? 您可以讓一個工作線程獲取該項目,對其進行處理,然后繼續進行下一個。

暫無
暫無

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

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