如何在线程中使用队列时为main中的特定变量创建锁

里亚斯

我试图弄清楚在python中如何声明要锁定的特定变量,以便一次只能有一个线程访问它以避免竞争条件。如果我有两个线程通过队列不断更新一个变量,但是我也在main中手动更新该变量,那么所有线程将那个变量声明为共享资源的正确方法是什么,以便在两次访问之间一次只能访问它正在运行的线程和主要线程?

我写了一些示例代码来说明我的意思。

import time

from random import randint
from threading import Thread
from queue import Queue

# Add the amount by random number from 1 - 3 every second
def producer(queue, amount):
    while True:
        time.sleep(1)
        amount[0] += randint(1, 3)
        queue.put(amount)

# Subtract the amount by random number from 1 - 3 every second
def consumer(queue, amount):
    while True:
        item = queue.get()
        amount[0] -= randint(1, 3)
        queue.task_done()

amount = [10]

queue = Queue()
t1 = Thread(target=producer, args=(queue, amount,))
t2 = Thread(target=consumer, args=(queue, amount,))

t1.start()
t2.start()

while True:
    n = input("Type a number or q: ")
    if n == 'q':
        break
    else:
        # Here is where I am confused about how to declare the amount a
        # shared resource and lock it in a way that the queues would also 
        # adhere to
        amount[0] += int(n)
        print("amount is now: {}".format(amount[0]))

t1.join()
t2.join()
杰伊·乔希

更新变量的值时,锁定变量很重要。因此,根据您的情况,确实需要锁定机制。

如何锁定:

创建一个threading.Lock对象,它将帮助您锁定和释放代码块。

  • 获取:锁定代码块。只有一个线程可以进入此块。其他线程将等待直到释放。
  • 释放:释放获得的锁。

在您的情况下:

import time

from random import randint
from threading import Thread,Lock
from queue import Queue

# Add the amount by random number from 1 - 3 every second
def producer(queue, amount,lock):
    while True:
        time.sleep(1)
        lock.acquire()
        amount[0] += randint(1, 3)
        queue.put(amount)
        lock.release()

# Subtract the amount by random number from 1 - 3 every second
def consumer(queue, amount,lock):
    while True:
        lock.acquire()
        item = queue.get()
        amount[0] -= randint(1, 3)
        queue.task_done()
        lock.release()

amount = [10]
lock = Lock()
queue = Queue()
t1 = Thread(target=producer, args=(queue, amount,lock))
t2 = Thread(target=consumer, args=(queue, amount,lock))

t1.start()
t2.start()
 ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Perl:在线程中使用eval时为空变量

如何在C中为多线程使用互斥锁?

如何在线程中访问队列-Java

如何在线程完成时从线程中获取结果?

如何在freeRTOS中使用互斥锁同步线程?

在线程A中创建对象,在线程B中使用。是否需要互斥体?

如何在C编程中的子线程中使用互斥锁处理同步

如何在python中创建跨线程跨进程锁?

我如何在线程中使用true?

如何在线程中创建可共享对象?

在线程中使用全局变量

如何在Python中使用固定数量的线程处理队列中的多个作业

使用较少锁的指针队列在线程之间移动数据是否安全

如何使用POSIX线程在C中创建特定于线程的全局变量?

ProgrammingError:在线程中创建的SQLite对象只能在同一线程中使用

Streamlit-在线程中创建的SQLite对象只能在同一线程中使用

SQLAlchemy + pyTelegramBotAPI:在线程中创建的SQLite对象只能在同一线程中使用

在线程中创建的DatabaseWrapper对象只能在同一线程中使用。”当尝试使用celery插入数据库时

如何在线程中使用 websockets 服务器并正确关闭线程并关闭事件循环?

如何在iOS中使用条件计时器为后台线程创建GCD块?

当尚未创建队列时,如何在使用ISendEndpoint发送消息时如何将RequiresSession设置为true?

使用线程池时,如何在Java中使线程空闲?

在Delphi中使用线程队列时,如何确保释放线程?

如何在线程之间传递参数时使用Python线程

如何在线程内使用 QDateTime?

启动时如何在RabbitMQ中创建队列

是否建议在线程创建过程中在Linux FIFO中使用param.sched_priority?

如何在从多线程调用的共享库中使用互斥锁?

如何在Linux上的C多线程中使用互斥锁