python 中的多处理不打印任何语句
Multiprocessing in python doesnt print any statements
多线程正在打印输出但不是多处理。搜索stack overflow并回答问题没有解决问题。
多处理不工作。
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
之间移动。 (好吧,实际上,这有点简化,取决于您使用的 OS 和多处理生成器,但我离题了。)
最简单的通信渠道是 multiprocessing.Queue
(实际上“神奇地”在进程之间工作)。
如进一步评论中所述,
- 您不能在 IDE 中使用
multiprocessing
,因为它在执行脚本之前不会保存您的脚本,因为它需要能够生成脚本的副本,如果没有磁盘上的脚本,没有什么可生成的。
- 类似地,您不能很好地使用 Jupyter 笔记本中的
multiprocessing
,因为它们不是 运行 作为常规 Python 脚本,而是通过 Python 内核进程 Jupyter 启动。
这里是对您的代码的简单改编,以实际在进程之间传递数据。
记得用if __name__ == "__main__"
保护你的多重处理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)
多线程正在打印输出但不是多处理。搜索stack overflow并回答问题没有解决问题。
多处理不工作。
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
之间移动。 (好吧,实际上,这有点简化,取决于您使用的 OS 和多处理生成器,但我离题了。)
最简单的通信渠道是 multiprocessing.Queue
(实际上“神奇地”在进程之间工作)。
如进一步评论中所述,
- 您不能在 IDE 中使用
multiprocessing
,因为它在执行脚本之前不会保存您的脚本,因为它需要能够生成脚本的副本,如果没有磁盘上的脚本,没有什么可生成的。 - 类似地,您不能很好地使用 Jupyter 笔记本中的
multiprocessing
,因为它们不是 运行 作为常规 Python 脚本,而是通过 Python 内核进程 Jupyter 启动。
这里是对您的代码的简单改编,以实际在进程之间传递数据。
记得用if __name__ == "__main__"
保护你的多重处理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)