3

我正在尝试在 python 中构建一个依赖多个线程的程序,并在线程之间共享数据。我试图避免使用 global 关键字执行此操作,但到目前为止还没有到达任何地方。

作为一个简单的例子(下面的代码),我的 main() 函数产生了一个线程 thread1,它应该能够访问变量 count,在这种情况下只是为了打印它。同时,main() 对这个变量进行了迭代,thread1 应该可以看到计数的变化。这里有一些自包含的代码:

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() 方法,如果没有另一个方法,我无法看到如何做到这一点thread1里面的独立线程,看起来太复杂了。

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()

如果您想使用多个线程之间共享的相同计数,您可以将您的计数放入仅包含一个元素的列表中。这样,当将计数分配给线程属性时,它就不会是硬拷贝。

于 2012-12-04T09:58:53.433 回答