Python:多处理队列似乎不可访问
我很困惑为什么这个代码看起来挂起了,什么都不做?在我尝试进行实验时,似乎无法从将项目添加到队列的函数外部获取访问队列的函数。对不起,我是个新手。我需要pip安装一些东西吗?更新:Win10,python3.7.8,这个问题似乎适用于队列之外的其他变量 此代码适用于: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
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+中,所有内容始终仅通过引用传递。但对于简单类型(字符串、整数等),它们似乎是按值传递的,因为这些对象是不可变的,不能更改。