程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Python 多处理不会让其余代码执行[重复]

发布于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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

18 0
收藏该文
已收藏

评论内容:(最多支持255个字符)