python - python中的多处理不打印任何语句
问题描述
多线程正在打印输出,但不是多处理。搜索堆栈溢出并回答问题并没有解决问题。
多处理不起作用。
from threading import Thread
import datetime
from multiprocessing import Process
import sys
import time
def func1():
print('Working')
time.sleep(5)
global a
a=10
print(datetime.datetime.now())
def func2():
print("Working")
time.sleep(10)
print(datetime.datetime.now())
p1 = Process(target=func1)
p1.start()
p2 = Process(target=func2)
p2.start()
p1.join()
p2.join()
print(a)
甚至 print(a) 也没有打印该值。它说
NameError: name 'a' is not defined
解决方案
正如我所评论的,普通变量,无论它们是否是全局变量,都不会在multiprocessing
Process
es 之间神奇地传播。(嗯,实际上,这有点简化,取决于您使用的操作系统和多处理生成器,但我离题了。)
最简单的通信通道是一个multiprocessing.Queue
(实际上“神奇地”在进程之间工作)。
正如进一步评论中所讨论的,
- 您不能
multiprocessing
在执行脚本之前不保存脚本的 IDE 中使用,因为它需要能够生成脚本的副本,并且如果磁盘上没有脚本,则不会生成任何内容。 - 类似地,你不能
multiprocessing
很好地使用 Jupyter 笔记本,因为它们不是作为常规 Python 脚本运行的,而是通过 Python 内核进程 Jupyter 启动的。
这是您的代码的简单改编,以在进程之间实际传递数据。
请记住main()
使用if __name__ == "__main__"
.
import datetime
import time
import multiprocessing
def func1(q: multiprocessing.Queue):
print("func1 thinking...")
time.sleep(2)
q.put(("func1", 10))
print("func1 quit at", datetime.datetime.now())
def func2(q: multiprocessing.Queue):
for x in range(10):
print("func2 working", x)
q.put(("func2", x))
time.sleep(0.3)
def main():
queue = multiprocessing.Queue()
p1 = multiprocessing.Process(target=func1, args=(queue,))
p2 = multiprocessing.Process(target=func2, args=(queue,))
p1.start()
p2.start()
p1.join()
p2.join()
print("Subprocesses ended, reading their results...")
while not queue.empty():
print(queue.get())
if __name__ == "__main__":
main()
输出是:
func1 thinking...
func2 working 0
func2 working 1
func2 working 2
func2 working 3
func2 working 4
func2 working 5
func2 working 6
func1 quit at 2021-06-16 17:58:46.542275
func2 working 7
func2 working 8
func2 working 9
2021-06-16 17:58:47.577008
Subprocesses ended, reading their results...
('func2', 0)
('func2', 1)
('func2', 2)
('func2', 3)
('func2', 4)
('func2', 5)
('func2', 6)
('func1', 10)
('func2', 7)
('func2', 8)
('func2', 9)
推荐阅读
- reactjs - 如何在本机反应中修复这些错误?
- php - 如何从下拉列表中选择一个值,然后单击提交,然后在 div 部分的同一页面中打印值进一步 div 也使用按钮?
- vue.js - Vuex 状态数据没有持久化?
- android - Cmd/React Native 无法检测到我的 JAVA_HOME 环境变量
- php - 在我的插件中,为什么 $_SESSION 仅在我登录 wp-admin 时才起作用?
- yii2 - YII2 富文本编辑器
- c# - 数据集 XML 读取无法在 C# 中启用约束
- spring-boot - 无法从 KeyCloak 获取访问令牌
- javascript - 如何改进加载动画类型?
- java - 如何从 Vue 中的 Javascript 调用 Android 中的 java 函数?