如何使生成的进程永远等待,直到一个项目出现在 python 的队列中
How to make spawned process wait forever till an item appears in queue in python
我有两个 classes 用于从命令行自动化 gdb,主要的 class 创建一个进程,用于从命令行执行 gdb 命令,然后发送命令到 gdb_engine class(我覆盖了 运行() 方法,它也有 gdb 相关的功能)取决于用户请求。这两个独立的进程从保存应完成的作业的队列进行通信。为了完成这个任务,我想到了这个简单的方案:
1-检查队列
2-如果队列为空则等待,如果不是,则执行队列中的第一个函数
3-重写队列
4-return 到 1
但是如果队列为空,我无法在多处理文档中找到任何生成生成进程 stop/sleep 的函数。我确信有办法做到这一点,但由于我在 python 仍然是初学者,所以我无法轻松找到自己的方法。在这一点上事情仍然有点混乱。
提前致谢,祝您有美好的一天! (顺便说一句,我使用 python3.4)
编辑:我现在没有太多事情要做,但仍在根据 grzgrzgrz3 的要求发布我的代码。代码库有点大,所以我只是 copy/pasting 多处理相关的。
GDB_Engine class,我用 pexpect 控制 gdb:
class GDB_Engine(Process):
jobqueue=Queue()
def __init__(self):
super(GDB_Engine, self).__init__()
self.jobqueue=GDB_Engine.jobqueue
def run(self):
#empty since I still don't know how to implement that algorithm
节目主体
if __name__ == "__main__":
gdbprocess=GDB_Engine()
gdbprocess.start()
每当我需要做这样的工作时,我只是将项目放入队列(将 gdb 附加到目标的代码中间):
gdbprocess.jobqueue.put("attachgdb")
我的主要想法是生成进程将比较队列中的字符串和 运行 GDB_Engine class 中的指定函数,以显示示例,这是附加代码:
def attachgdb(self,str):
global p
p=pexpect.spawnu('sudo gdb')
p.expect_exact("(gdb) ")
p.sendline("attach " + str)
p.expect_exact("(gdb) ")
p.sendline("c")
p.expect_exact("Continuing")
我刚发现如果队列为空,get() 方法会自动阻塞进程,所以我的问题的答案很简单。我应该在问之前多尝试这些方法,看起来这只是我的另一个愚蠢和不必要的问题。
我有两个 classes 用于从命令行自动化 gdb,主要的 class 创建一个进程,用于从命令行执行 gdb 命令,然后发送命令到 gdb_engine class(我覆盖了 运行() 方法,它也有 gdb 相关的功能)取决于用户请求。这两个独立的进程从保存应完成的作业的队列进行通信。为了完成这个任务,我想到了这个简单的方案:
1-检查队列
2-如果队列为空则等待,如果不是,则执行队列中的第一个函数
3-重写队列
4-return 到 1
但是如果队列为空,我无法在多处理文档中找到任何生成生成进程 stop/sleep 的函数。我确信有办法做到这一点,但由于我在 python 仍然是初学者,所以我无法轻松找到自己的方法。在这一点上事情仍然有点混乱。
提前致谢,祝您有美好的一天! (顺便说一句,我使用 python3.4)
编辑:我现在没有太多事情要做,但仍在根据 grzgrzgrz3 的要求发布我的代码。代码库有点大,所以我只是 copy/pasting 多处理相关的。
GDB_Engine class,我用 pexpect 控制 gdb:
class GDB_Engine(Process):
jobqueue=Queue()
def __init__(self):
super(GDB_Engine, self).__init__()
self.jobqueue=GDB_Engine.jobqueue
def run(self):
#empty since I still don't know how to implement that algorithm
节目主体
if __name__ == "__main__":
gdbprocess=GDB_Engine()
gdbprocess.start()
每当我需要做这样的工作时,我只是将项目放入队列(将 gdb 附加到目标的代码中间):
gdbprocess.jobqueue.put("attachgdb")
我的主要想法是生成进程将比较队列中的字符串和 运行 GDB_Engine class 中的指定函数,以显示示例,这是附加代码:
def attachgdb(self,str):
global p
p=pexpect.spawnu('sudo gdb')
p.expect_exact("(gdb) ")
p.sendline("attach " + str)
p.expect_exact("(gdb) ")
p.sendline("c")
p.expect_exact("Continuing")
我刚发现如果队列为空,get() 方法会自动阻塞进程,所以我的问题的答案很简单。我应该在问之前多尝试这些方法,看起来这只是我的另一个愚蠢和不必要的问题。