【问题标题】:What's a clean way to pass context down functions?将上下文向下传递函数的干净方法是什么?
【发布时间】:2018-10-25 20:32:31
【问题描述】:

我正在尝试使用锁作为上下文来管理同步文件操作。但是,当一个函数调用另一个需要锁的函数时,我最终会永远阻塞。

例如:

from threading import Lock
lock = Lock()


def foo():
    print('foo')
    with lock:
        print('foo-locked')
        bar()


def bar():
    print('bar')
    with lock:
        print("bar-locked")  # Will not print since lock is owned by foo()

foo()

有没有一种简洁的方法可以将一个函数的上下文传递给另一个函数?我宁愿不将锁作为参数发送 - 然后我会在某些函数中使用上下文管理器,而不是在其他函数中。

【问题讨论】:

  • 对我来说,尝试从另一个函数的锁中调用使用锁的函数似乎是设计上的冲突。尝试设计不重叠的代码部分/功能,然后可以使用锁来确保互斥。
  • 你知道你的例子是单线程的,所以在这里使用锁没有意义吗?
  • 是的!只是为了解决问题。

标签: python multithreading locking


【解决方案1】:

您可以考虑使用重入锁 (Threading.RLock)。只要需要锁的 2 个函数在同一个线程中,它们就可以继续执行。

【讨论】:

  • 这可能无法解决所有用例,但它肯定对我有帮助!
猜你喜欢
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多