3

複数のスレッドに依存し、スレッド間でデータを共有するプログラムをPythonで構築しようとしています。global キーワードを使用してこれを回避しようとしていますが、これまでのところどこにも行きません。

簡単な例 (以下のコード) として、私の main() 関数は 1 つのスレッド thread1 を生成します。このスレッドは変数 count にアクセスできるはずです (この場合は単に出力するため)。同時に、main() はこの変数を反復し、スレッド 1 はカウントの変化を確認できるはずです。ここにいくつかの自己完結型コードがあります:

import threading
import time

class myThread (threading.Thread):

    def __init__(self, threadID):
        self.threadID = threadID
        threading.Thread.__init__(self)

    def run(self):
        global count
        for i in range(10):
            print "count is now: ", count, " for thread ", self.threadID, "\n"
            time.sleep(5)


def main():

    global count
    count = 0

    # spawn one or more threads
    thread1 = myThread(1)
    thread1.start()

    for i in range(20):
        time.sleep(2)
        count = count + 1

    # wait for thread1 to finish
    thread1.join()

main()

Python でスレッドについて読んだとき、global を使用する以外にこれを行う方法が見つかりませんでした。しかし、global について読むと、たいていの人は、正当な理由からめったに使用すべきではないと言い、Python から完全に削除すべきだと考える人さえいます。したがって、thread1 に main() がカウントを反復したことを「受動的に」検出し、その新しい値にアクセスする別の方法があるかどうか疑問に思っています。たとえば、私は python とポインターについてあまり知りません (python にも存在しますか?) が、いずれにせよ、これはまさに global が達成することだと思います。

理想的には、count が繰り返されるたびに main() から thread1 メソッドを呼び出して新しい self.count を設定できるようにすることができますが、thread1 にはブロックしている run() メソッドがあるため、別のメソッドがないとこれを行う方法がわかりません。複雑すぎるように見えるスレッド1内の独立したスレッド。

4

1 に答える 1

2

スレッドオブジェクトを作成し、クラス属性を入力できます。

import threading
class MyThreadClass(threading.Thread):
  def __init__(self, fruits):
    threading.Thread.__init__(self)
    self.fruits = fruits    

  def run(self):
    self.fruits.append('banana')  

list_fruit = ['apple', 'orange']    
print 'BEFORE:', list_fruit
thread = MyThreadClass(list_fruit)
thread.start() 
thread.join() #Wait for the thread to finish
print 'AFTER:', list_fruit

出力:

BEFORE: ['apple', 'orange']
AFTER: ['apple', 'orange', 'banana']

あなたの場合、あなたは試すことができます:

import threading
import time

class myThread (threading.Thread):

    def __init__(self, threadID):
        self.threadID = threadID
        self.count = 0
        threading.Thread.__init__(self)

    def run(self):
        for i in range(10):
            print "count is now: ", self.count, " for thread ", self.threadID, "\n"
            time.sleep(5)


def main():    
    # spawn one or more threads
    thread1 = myThread(1)
    thread1.start()

    for i in range(20):
        time.sleep(2)
        thread1.count = thread1.count + 1

    # wait for thread1 to finish
    thread1.join()
    print thread1.count

main()

複数のスレッド間で共有される同じカウントを使用する場合は、1つの要素のみを含むリストにカウントを入れることができます。このように、スレッド属性にカウントを割り当てるとき、それはハードコピーではありません。

于 2012-12-04T09:58:53.433 に答える