0

私は実際に多くの mysql 操作を含むマルチスレッド プログラムを使用していますが、基本的には、すべてのクエリを機能させるスマートな方法を考え出す必要があるため、非常に苦労しています。これにより、モジュールをスレッドセーフにする方法を考えさせられました。

とにかく、私はこのように質問しようとしています: さまざまなスレッドがたくさんある txt ファイルに常に新しいコンテンツを追加する必要があるとしmain.pyます。

import threading

lock = threading.RLock()

def AppendStr(the_str):
    write_thread = threading.Thread(target = RealAppending, args = (the_str, ))
    write_thread.start()

def RealAppending(the_str):
    lock.acquire()

    the_file = open("test.txt", "a")
    the_file.append(the_str)
    the_file.close()

    lock.release()

def WorkerThread(some_arg):
    do stuff

    AppendStr("whatever you like")

for counter in range(100):
    new_thread = threading.Thread(target = WorkerThread, args = (some_arg, ))
    new_thread.start()

さて、問題は、コードをきちんとして維持しやすくしようとしている場合、以下のコードを に入れても機能するかということ write.pyです:

import threading

lock = threading.RLock()

def AppendStr(the_str):
    write_thread = threading.Thread(target = RealAppending, args = (the_str, ))
    write_thread.start()

def RealAppending(the_str):
    lock.acquire()

    the_file = open("test.txt", "a")
    the_file.append(the_str)
    the_file.close()

    lock.release()

で次のようにし ます:( Pythonでmain.pyどのように機能するのか本当にわかりません)import

import write

def WorkerThread(some_arg):
    do stuff

    write.AppendStr("whatever you like")

for counter in range(100):
    new_thread = threading.Thread(target = WorkerThread, args = (some_arg, ))
    new_thread.start()

またwrite.py、マルチスレッドの方法で使用している他のモジュールがたくさんある場合、それらのモジュールをインポートして、そこからmain.py別のモジュールを呼び出しますdef。すべてが期待どおりに機能しますか? そうでない場合、このように使用できる究極のスレッドセーフなモジュールを設計するにはどうすればよいですか?

write.py他の多くのモジュールにインポートされている場合、それらはすべて同じものを共有していlockますか? そのようなモジュールの変数のスコープは何ですか?

4

1 に答える 1

0

これはスレッドセーブモジュールのように見えますが、間違いがあります:

これはより良いバージョンです:

def RealAppending(the_str):
    lock.acquire()
    try:
        the_file = open("test.txt", "a")
        try:
            the_file.write(the_str) # write
        finally:
            the_file.close()
    finally: # if an error occurs
        lock.release()

なぜなら:

  • ファイルへの書き込み中にエラーが発生した場合は、ロックを解除する必要があります

上記の構文は、Python 2.3 以前用です。

これは、まったく同じことを行う改良版です。

def RealAppending(the_str):
    with lock:
        with open("test.txt", "a") as the_file:
            the_file.write(the_str) # write

そうです、あなたのモジュールはスレッドセーブです。ユーザーがスレッドを保存しない方法で使用するのを防ぐために追加できるものがいくつかあります。

# write.py
__all__ = ['AppendStr'] # put all functions in except the ones others shall not see
# so id you do from write import * nothing else will be imported but what is __all__

ただし、文字列がファイルに書き込まれる順序を知ることはできません。

于 2012-05-12T18:46:14.277 に答える