0

扱いたいデータのリストがあります。ただし、効率を上げるには、複数のインスタンスでデータを処理する必要があります。

各インスタンスが1つのアイテムを取り出すたびに、リストからアイテムを削除し、いくつかの手順で処理します。

最初にリストをsqliteデータベースに保存しようとしましたが、sqliteでは複数の読み取りロックが許可されているため、複数のインスタンスがデータベースから同じアイテムを取得する可能性があります。

各インスタンスが処理する一意のアイテムを取得する方法はありますか?必要に応じて、他のデータ構造(他のデータベースまたはファイルのみ)を使用できます。

ちなみに、cursor.execute(delete_query)を実行した後、DELETE操作が成功したかどうかを確認する方法はありますか?

4

4 に答える 4

0

最も簡単な方法は、単一のプロセスでアイテムを生成し、それらを処理のために複数のワーカープロセスに渡すことです。

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()
于 2012-07-11T14:32:55.240 に答える
0

私が知っていることから、Pythonとの真の並行性を得るには、Pythonインタープリターの複数のインスタンスを起動する必要があります(または、少なくとも複数の実行中のプロセスを使用して、次のことができます。

  • 他の人に(たとえば0mqのようなものを介して)取得できるレコードを通知する1つのブローカープロセスを作成します。これにより、ブローカーがボトルネックになる可能性があります。
  • データが簡単に割り切れる場合は、プロセスごとにデータベースの一部を切り取ります(たとえば、主キーの昇順の数字)。

グリーンレットやタスクレットのようなものは、実際には次々に実行されます。真のスレッド化/プロセスオーバーヘッドがないため、非常に高速に切り替わりますが、真に同時に実行されるわけではありません。

于 2012-07-11T10:17:25.410 に答える
0

フラグとしてのdbの別のフィールド(例:PROCESSING、UNPROCESSED、PROCESSED)はどうですか?

于 2012-07-11T10:17:37.663 に答える
0

データベースからすべてのアイテムを読み込んでキューに入れてみませんか?ワーカースレッドでアイテムを取得して処理し、次のスレッドに進むことができます。

于 2014-01-03T16:40:30.303 に答える