我尝试制作一个程序,要求用户输入,读取器功能打印输入,而输入功能不会阻止读取器功能。
我能做什么
import multiprocessing as mp
import time
def ProInput(queue):
while True:
if queue.empty():
print("{} waiting an item".format(mp.current_process().name))
else:
item = queue.get()
if(item == 'exit'):
break;
else:
print("{} processing {}".format(mp.current_process().name, item))
time.sleep(1)
def InputRead(queue):
while True:
f = input("Insert your input :")
queue.put(f)
if(f == 'exit'):
break;
print("You insert {} into the system".format(f))
if __name__ == '__main__':
st = time.time()
q = mp.Queue()
OutputSys = mp.Process(target=ProInput, name='Reader', args=(q,))
OutputSys.daemon = True
OutputSys.start()
InputRead(q)
et = time.time()
OutputSys.join()
print('Total running time {}'.format(et-st))
是否可以在第一个终端中使用Input功能而在另一个终端中使用Reader功能?我的意思是,我可以在不受Reader函数干扰的情况下给出输入。My Program Looks like
常见问题
问:为什么不删除Reader中的打印功能?你的问题解决了!
答:我需要在程序中监控这个过程。
聚苯乙烯。 :随意修正我的语法,因为我的英语仍然破碎。
答案 0 :(得分:0)
请澄清你的意思,说“另一个终端”。多处理本身并不处理终端(TTY / PTY)分配或管理,并且进程有多个用户可访问的终端有点不寻常。
如果我理解你的问题,你基本上希望监控你的程序(健康检查)。有两种常见的一般方法:
如果您只需要在某处输出状态信息,请考虑写入某些日志(例如文件,syslog或某些UDP套接字 - 考虑使用logging
模块,因为它非常灵活)。然后设置您的监控解决方案将监视日志文件(或在套接字上侦听新消息)并做出相应的反应。
即。而不是print
做这样的事情:
import logging
def setup_logger():
# Just a very primitive example. Not a good code.
logger = logging.getLogger("proinput")
logger.setLevel(logging.DEBUG)
# Or `fh = logging.StreamHandler(sys.stdout)`
# to get the same effect as your previous print calls
fh = logging.FileHandler("proinput.log")
fh.setLevel(logging.DEBUG)
formatter = logging.Formatter(
"[%(asctime)s] %(process)d[%(processName)s] "
"%(name)s (%(funcName)s): %(levelname)s: %(message)s"
)
fh.setFormatter(formatter)
logger.addHandler(fh)
return logger
def pro_input(queue):
logger = setup_logger()
while True:
...
logger.info("Waiting for an item")
...
logger.info("Processing: %s", repr(item))
上面的例子非常原始,不灵活,不能很好地扩展。查看logging documentation(特别是教程和configuring logging部分 - 这就是我说日志记录很灵活时的意思)和a question on using logging with multiprocessing以获取更多信息。
如果你真的想拥有两个终端,这种方法也会允许你的“多终端”情况。只需使用预先创建的终端设备(例如,打开一个新的控制台窗口,运行tty
并输出类似/dev/pts/9
的内容)作为输出文件,并在通过命令行启动程序时传递此信息选项或环境变量。
另一个选择是实现一个特殊的服务器(例如HTTP或简单的TCP),它允许监控软件连接并查询状态。我们的想法是在您的计划中设立一个独立的流程,专门为外部世界提供状态信息。
这对于像您这样的交互式软件来说并不常见,但对于服务器来说,这是一种非常流行的方法,可以实现健康检查。如果您的软件“无头”并且用户输入仅用于原型设计,请考虑检查Prometheus。它有一个很好的检测库,可以通过HTTP轻松测量和输出数据。
您选择哪种方法(被动观看与主动查询)取决于您的监控解决方案和您的个人偏好。