【问题标题】:Can global variables be accessed from a thread within a new process?可以从新进程中的线程访问全局变量吗?
【发布时间】:2019-04-03 00:29:15
【问题描述】:

在脚本的主线程中,我设置了一个名为 queue 的变量并用 URL 填充它。然后我使用 multiprocessing.Process 创建 8 个进程,然后这些进程使用 threading 库生成 10 个线程。

在线程工作者(由上面的另一个进程产生)中,我有global queue

那么queue.get() 会按预期行事吗?我已经尝试过了,在某些测试中似乎还可以,而在其他测试中则不行。

问题是,可以从另一个进程和线程访问全局变量吗?

【问题讨论】:

    标签: python multithreading


    【解决方案1】:

    很难理解你到底在问什么。但这里有两个主要问题:

    全局变量可以被其他进程访问吗?

    不,不是没有某种形式的进程间通信,即使那样你也会将该变量的副本传递给另一个进程。每个进程都有自己的全局状态。

    可以从另一个线程访问全局变量吗?

    是的,同一个进程中的一个线程可以访问一个全局变量,但是你必须确保多个线程访问的任何内存的安全性。这意味着,线程不应与其他线程同时访问可写内存,否则您将面临一个线程写入内存而另一个线程尝试读取它的风险。

    回答以上问题

    如果我正确理解设置,您的每个子进程都有自己的全局变量queue。这些queues 中的每一个都应该只能由在该进程中产生的线程访问。

    【讨论】:

    • 新线程是由一个新进程产生的,也就是全局变量可以从另一个进程和线程访问。
    • 由不同进程产生的线程无法访问相同的全局变量。因此,如果您在进程 Pa 中生成线程 Ta,并在进程 Pb 中生成线程 Tb,则 Ta 和 Tb 将不会有任何可共享的全局状态,因为它们属于不同的进程。
    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多