【问题标题】:When to put locks for multi-threading and multi-processing?何时为多线程和多处理加锁?
【发布时间】:2013-07-06 16:05:10
【问题描述】:

打印到标准输出时是否需要这样做:

   `lock.acquire()`
    #printing to standard output
    lock.release()

适用于多线程和多进程。
仅在从全局文件或全局变量的值中读取时也必须这样做吗??

PS:我在 python 2.7 中做多线程和多处理。

【问题讨论】:

    标签: python multithreading python-2.7 multiprocessing


    【解决方案1】:

    你可以简化为

    with lock:
        print(something)
    

    但是是的,您需要避免打印被各种线程混合。

    当使用只读变量时,您不需要锁。读取文件时(因为您正在更改状态),您确实需要。

    【讨论】:

    • 从全局文件或变量中读取怎么样?我也对多处理做同样的事情吗??
    • 改变状态是什么意思??如果不同的线程只使用全局文件来运行 os 命令,例如:运行类似 python test.py _myoutput standard_output 的命令,这里 test.py 只是逐字符比较两个文件。test.py 和 standard_output 是全局的文件??此外,如果线程使用指向文件的不同文件指针读取??
    • @sashasami 这不是问题。我虽然每个线程都会读取同一个文件的一部分......
    • @Jbernado 在多处理的情况下怎么办??
    • 同样的事情。只有在更改某些共享状态时才需要锁
    【解决方案2】:

    由于 GIL,Python 的打印是线程安全的,您不会通过从多个线程打印来破坏 Python 的内部状态。

    但是,如果您想确保多个打印语句将其所有打印按逻辑方式分组,您确实需要一种方法来确保以正确的顺序打印。您发现的一种方法是使用锁,另一种 IMO 更简单的方法是构建一个包含需要一起打印的所有内容的单个字符串。

    【讨论】:

    • 多进程呢??
    • Print 并不完全是线程安全的(即使在 CPython 中也不行)。如果你打印多个参数,它可能会交错。
    • 'Python' 没有 GIL,只有 cPython 实现有,所以第一行不适用于 pypy、jython 或 ironpython...
    猜你喜欢
    • 2012-07-24
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    相关资源
    最近更新 更多