Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:多处理队列似乎不可访问_Python - Fatal编程技术网

Python:多处理队列似乎不可访问

Python:多处理队列似乎不可访问,python,Python,我很困惑为什么这个代码看起来挂起了,什么都不做?在我尝试进行实验时,似乎无法从将项目添加到队列的函数外部获取访问队列的函数。对不起,我是个新手。我需要pip安装一些东西吗?更新:Win10,python3.7.8,这个问题似乎适用于队列之外的其他变量 此代码适用于: from multiprocessing import Queue, Process q = Queue() def main(): q.put('a') q.put('b') print(q.get(b

我很困惑为什么这个代码看起来挂起了,什么都不做?在我尝试进行实验时,似乎无法从将项目添加到队列的函数外部获取访问队列的函数。对不起,我是个新手。我需要pip安装一些东西吗?更新:Win10,python3.7.8,这个问题似乎适用于队列之外的其他变量

此代码适用于:

from multiprocessing import Queue, Process

q = Queue()

def main():
    q.put('a')
    q.put('b')
    print(q.get(block=True) + ' gotten')
    print(q.get(block=True) + ' gotten')

if __name__ == '__main__':
    main()
此代码不起作用:

from multiprocessing import Queue, Process

q = Queue()

def main():
    putter_process = Process(target=putter)
    putter_process.start()
    print(q.get(block=True) + ' gotten')
    print(q.get(block=True) + ' gotten')

def putter():
    q.put('a')
    q.put('b')

if __name__ == '__main__':
    main()
类似地,来自的代码也挂断了我的电话:

import time
from multiprocessing import Process, Queue

sensor_data_queue = Queue()


def reads_sensor_data():
    # Suppose we add a sensor reading every second; this simulates that. It runs 10 iterations. You could modify this
    # to run forever, or until something tells it to quit.

    for iteration in range(10):
        sensor_data_queue.put(random.random())  # Generate a random number.
        time.sleep(1)  # Sleep for 1 second

    sensor_data_queue.put(None)  # None means we're done.


def analyze_sensor_data():
    while 1:
        data = sensor_data_queue.get(block=True)
        if data is None:
            break
        else:
            print(f'Analyzing {data}... Beep, beep, boop... {data * 100}')
    print('All done!')

def main():
    # Run the reader process in the background...
    reader_process = Process(target=reads_sensor_data)
    reader_process.start()
    try:
        analyze_sensor_data()
    finally:
        reader_process.join()
    
if __name__ == '__main__':
    main()    
编辑:我不确定这是否与队列有关,因为当我尝试更改常规文本变量时,它也不起作用

from multiprocessing import Queue, Process
import time

text = 'start'

def main():
    putter_process = Process(target=putter)
    putter_process.start()
    time.sleep(2)
    print(text)

def putter():
    text = 'edited'

if __name__ == '__main__':
    main()

上面的输出是
start
,而我希望它输出
edited

Hmmm。我在Linux上测试了我给你的示例,你说不起作用的第二个块代码在Linux上确实起作用。我查阅了文件,确实是这样:

全局变量

请记住,如果在子进程中运行的代码试图访问全局变量,则它看到的值(如果有)可能与调用process.start时父进程中的值不同

然而,仅仅是模块级常量的全局变量不会引起任何问题

解决方案 我无法测试这一点,因为我没有可用的操作系统,但我会尝试将队列传递给每个函数。以你为例:

来自多处理导入队列,进程
def main():
q=队列()
推杆\过程=过程(目标=推杆,参数=(q,))
putter_进程开始()
打印(q.get(block=True)+“get”)
打印(q.get(block=True)+“get”)
def推杆(q):
q、 放('a')
q、 put('b')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
根据我对文档的理解,这应该可以在Windows上运行,但我不能说我自己已经测试过了

关于元组的注记 在你的另一个问题中,你问为什么后面的逗号与
args=
相关。让我告诉你:

>>我的字符串=“你好,世界!”
>>>类型(我的字符串)
>>>打印(我的字符串)
你好,世界!
如您所见,我创建了一个字符串变量。现在,让我创建一个元组,它类似于一个列表,但是

>>我的元组=('hello,world','hola mundo')
>>>类型(我的元组)
>>>打印(我的元组)
(“你好,世界”,“你好,蒙多”)
如您所见,我创建了一个包含两个元素的元组,每个元素都是一个字符串。但是如果我想创建一个只有一个元素的元组呢?此将不起作用

>>我的元组=('hello,world')
>>>类型(我的非元组)
>>>打印(我的非元组)
你好,世界
如您所见,我只创建了一个字符串。但我可以通过添加逗号来创建一个包含一个元素的元组,这说明括号的存在是为了表明它是一个元组,而不是为了控制操作顺序:

>>我的元组=('hello,world',)
>>>类型(我的元组)
>>>打印(我的元组)
(‘你好,世界’,)

额外的逗号很重要,因为您需要传递的是元组,而不是字符串。

您使用的是什么操作系统?Win10。Python3.7.8I进行了编辑,以显示一些同样不起作用的简单代码。谢谢大家的关注。谢谢,我确认你的代码在Win10 Python 3.7.8上运行。我读过关于元组的书,然后把参数设为元组就意味着arg是通过引用而不是通过值传递的,这是真的吗?再一次,我真的很感谢你详细的回答。我本以为一个进程可以将一个对象作为参数,而不仅仅是一个包含该对象的元组。没问题。不,它不是按值传递的。当您传递args时,它必须是一个元组或列表;不能使用序列以外的任何东西将参数传递给进程。因此,可以使用args=[1,2,3]或args=(1,2,3)——元组的效率更高。仅供参考,在Python3+中,所有内容始终仅通过引用传递。但对于简单类型(字符串、整数等),它们似乎是按值传递的,因为这些对象是不可变的,不能更改。