发布于2024-11-30 18:01 阅读(901) 评论(0) 点赞(18) 收藏(1)
好吧,在搞清楚线程之后,我正在学习如何在 Python 中进行多处理,我编写的代码是一个简单的计时器,它会每秒计数一次,直到用户按下控制台中的 Enter 键来结束程序。我用线程编写了相同的程序,它成功了,但是当我尝试用多处理执行相同操作时,代码永远不会超过启动函数。有什么想法吗
我修复了括号的问题,现在计时器不是计时器()
import multiprocessing
import time
done = False
def timer():
counter = 0
while not done:
time.sleep(1)
counter += 1
print(counter)
if __name__ == '__main__':
p1 = multiprocessing.Process(target=timer())
p1.start()
# This code is never reached this works when using threads
input("Press enter to quit")
done = True
问题
您的代码存在问题,因为您正在调用 timer() 函数,而您应该将其作为目标传递给multiprocessing.Process.
您还写了target=timer()
,timer
遗嘱将立即执行,返回值,我想象它会是 None。
这不是您想要的——您正在尝试传递计时器函数本身,以便它可以在单独的进程中运行。
我注意到的另一件事是您的变量名为done
共享标志,您需要管理主进程和子进程。这种情况需要以这样一种方式进行管理,即子进程也能看到更新。
最重要的是,在创建进程时将其视为父子关系。
父进程(任何需要与子进程(您提供的计时器函数)通信的 python 文件)以告诉它何时停止任何执行。
对于你来说,最好的方法是使用multiprocessing.Value
文档
或multiprocessing.Event
文档
以下是一段代码片段来指导你
import multiprocessing
import time
def timer(done):
print("Timer started.")
counter = 0
while not done.is_set():
time.sleep(1)
counter += 1
print(counter)
print("Timer stopped.")
if __name__ == '__main__':
done = multiprocessing.Event()
p1 = multiprocessing.Process(target=timer, args=(done,))
p1.start()
input("Press enter to quit\n")
print("Stopping timer...")
done.set() # Signal the timer process to stop
p1.join() # Wait for the timer process to finish
print("Timer process has finished.")
如果您想将它与线程一起使用,请按以下方法操作。
import threading
import time
def timer(done):
print("Timer started.")
counter = 0
while not done.is_set():
time.sleep(1)
counter += 1
print(counter)
print("Timer stopped.")
if __name__ == "__main__":
done = threading.Event()
p1 = threading.Thread(target=timer, args=(done,))
p1.start()
input("Press enter to quit\n")
print("Stopping timer...")
done.set() # Signal the timer process to stop
p1.join() # Wait for the timer process to finish
print("Timer process has finished.")
或者
根据注释,您的输入必须是独立于进程的单独线程。首先执行类似这样的操作
import multiprocessing
import time
import threading
def timer(done):
print("Timer has started.")
counter = 0
while not done.is_set():
time.sleep(1)
counter += 1
print(counter)
print("Timer would stop.")
def first_wait_for_input(done):
input("Press enter to quit\n")
done.set() # signaling the timer to stop
if __name__ == '__main__':
done = multiprocessing.Event()
p1 = multiprocessing.Process(target=timer, args=(done,))
p1.start()
input_thread = threading.Thread(target=first_wait_for_input, args=(done,))
input_thread.start()
input_thread.join()
p1.join()
print("Timer process has finished.")
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/2046401/dc2478acb2e1449001a2/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!