【发布时间】:2021-02-18 17:08:12
【问题描述】:
我在尝试链接线程内存时遇到问题。我希望计数器在线程之间共享内存,所有线程都只计数到某个数字(在这种情况下为 100),最后它返回到主线程。问题是即使有锁所有线程也只有一个计数
import threading
from threading import Thread, Lock
import time
import multiprocessing
import random
def create_workers(n_threads, counter):
# counter = 0
workers = []
for n in range(n_threads):
worker = DataCampThread('Thread - ' + str(n), counter)
workers.append(worker)
for worker in workers:
worker.start()
for worker in workers:
worker.join()
return counter
def thread_delay(thread_name, num, delay):
num += 1
time.sleep(delay)
print(thread_name, '-------->', num)
return num
class DataCampThread(Thread):
def __init__(self, name, cou):
Thread.__init__(self)
self.name = name
self.counter = cou
delay = random.randint(1, 2)
self.delay = delay
self.lock = Lock()
def run(self):
print('Starting Thread:', self.name)
while self.counter < 100:
self.lock.acquire()
self.counter = thread_delay(self.name, self.counter, self.delay)
self.lock.release()
print('Execution of Thread:', self.name, 'is complete!')
if __name__ == '__main__':
# create the agent
n_threads = 3#multiprocessing.cpu_count()
counter = 0
create_workers(n_threads, counter)
print(counter)
print("Thread execution is complete!")
【问题讨论】:
-
当我运行当前问题中的代码时,所有线程似乎都有自己的计数并在不同的时间完成 - 所以不清楚问题是什么。 注意没有理由将最大值设置为 100,一个更小的值可以用于调试目的。
-
还不清楚为什么要使用
Lock,因为每个DataCampThread都有自己的计数器(因此多个线程永远不会更新任何共享内存)。 -
主要思想是只有一个计数,而不是每个线程有不同的计数。我认为每个线程都对异步主计数做出贡献
-
在这种情况下,您可能希望拥有一个全局共享的
count值,每个线程都会更新该值(在获取锁之后)。我会尝试向您展示如何做到这一点,但我并不真正了解正在发生的一切。定义自己的Thread子类的目的/目标到底是什么(而不是仅仅编写一个函数并将其作为内置Thread类的参数传递)? -
也想知道为什么
thread_delay()函数不是类的方法?
标签: python multithreading memory shared