我不想提出这个问题,因为对于一个相当出色的工具来说,这似乎是一个完全不合理的功能要求。但是,如果有任何读者对体系结构熟悉,我很想知道潜在的扩展是否可行。
我最近写了一个笔记本,里面有一些简单的线程代码,只是想看看我运行它时会发生什么。笔记本代码(tl;
dr启动了多个在睡眠循环中打印的并行线程)可在https://gist.github.com/4562840上获得。
通过在代码运行时按SHIFT-RETURN几次,您可以观察到内核的任何输出都出现在当前单元格的输出区域中,而不是运行代码的单元格的输出区域中。
我想知道是否有可能,如果某个单元格中的线程处于活动状态,则显示“刷新”按钮以允许异步更新输出区域。理想情况下,如果在所有线程结束后(在最终更新之后)单击刷新按钮,该按钮将消失。
但是,这将取决于能否识别和拦截每个线程的打印输出并将其定向到特定单元输出的缓冲区。所以,有两个问题。
我是否认为Python 2的print语句很难用,这意味着标准的解释器无法实现此增强功能,我是否正确?
鉴于可以在IPython内核中的另一层偷偷进入print()堆栈,Python 3的前景会更好吗?特别是对于那些不遵循Python链接到达此处的人,
[没有人期望西班牙宗教裁判所]更笼统地说,您能否指出将多个流传递到页面中的示例(与语言无关)?是否存在用于构建和修改DOM以解决此问题的最佳实践?
更新:
我是否认为Python 2的print语句很难用,这意味着标准的解释器无法实现此增强功能,我是否正确?
不,print语句的重要部分根本没有固定连接。print只需写入sys.stdout,它可以是任何带有write
和flush
方法的对象。IPython已经完全替换了此对象,以便首先将stdout传递到笔记本(请参见下文)。
鉴于可以在IPython内核中的另一层偷偷进入print()堆栈,Python 3的前景会更好吗?特别是对于那些不遵循Python链接到达此处的人,
否-只需覆盖sys.stdout即可,而不是自己打印(请参见上面,下面和其他地方)。这里没有Python 3的优势。
[没有人期望西班牙宗教裁判所]更笼统地说,您能否指出将多个流传递到页面中的示例(与语言无关)?
当然-
IPython笔记本本身。它使用消息ID和元数据来确定stdout消息的来源,然后确定这些消息应在何处结束。下面,在我对显然没有人提出的问题的原始回答中,我展示了一个示例,该示例同时绘制来自多个线程正在同时运行的单元的输出。
为了获得所需的刷新行为,您可能需要做两件事:
threading.current_thread().ident
)的消息。这应该在上下文管理器中完成(如下所示),因此它只会影响您实际想要的打印语句。原始答案(错误,但相关的问题):
它依赖于一些恶作剧和私有API,但这在当前的IPython中是完全可能的(可能不会永远存在)。
这是一个示例笔记本:http :
//nbviewer.ipython.org/4563193
为此,您首先需要了解IPython如何将标准输出到笔记本。这是通过用OutStream对象替换sys.stdout来完成的。这将缓冲数据,然后在调用时通过zeromq发送数据,sys.stdout.flush
最终将其存储在浏览器中。
现在,如何将输出发送到特定的单元格。
IPython消息协议
使用“父”标头来标识哪个请求产生了哪个答复。每次您要求IPython运行一些代码时,它都会设置各种对象的父标头(包括sys.stdout),以便它们的副作用消息与导致它们的消息相关联。在线程中运行代码时,这意味着当前的parent_header只是最新的execute_request,而不是启动任何给定线程的原始parent_header。
考虑到这一点,这是一个上下文管理器,可将stdout的父标头临时设置为特定值:
import sys
from contextlib import contextmanager
stdout_lock = threading.Lock()
@contextmanager
def set_stdout_parent(parent):
"""a context manager for setting a particular parent for sys.stdout
the parent determines the destination cell of output
"""
save_parent = sys.stdout.parent_header
# we need a lock, so that other threads don't snatch control
# while we have set a temporary parent
with stdout_lock:
sys.stdout.parent_header = parent
try:
yield
finally:
# the flush is important, because that's when the parent_header actually has its effect
sys.stdout.flush()
sys.stdout.parent_header = save_parent
这是一个线程,它在线程启动时记录父对象,并在每次执行print语句时都应用该父对象,因此它的行为就像仍在原始单元格中一样:
import threading
class counterThread(threading.Thread):
def run(self):
# record the parent when the thread starts
thread_parent = sys.stdout.parent_header
for i in range(3):
time.sleep(2)
# then ensure that the parent is the same as when the thread started
# every time we print
with set_stdout_parent(thread_parent):
print i
最后,一个笔记本将所有内容捆绑在一起,并带有时间戳,显示实际并发打印到多个单元格:
http://nbviewer.ipython.org/4563193/
问题内容: 我在PyQt中有一个带有功能的GUI 。容易想象,当新图像应添加到QListWidget中时被调用。为了检测文件夹中的新图像,我使用了with来检测文件夹中的文件更改,然后该线程直接调用。 出于线程安全的原因,这会产生不应在gui线程之外调用的警告。 使此线程安全的最佳和最简单的方法是什么?QThread?信号/插槽?QMetaObject.invokeMethod?我只需要从线程传递
问题内容: 您认为获得线程工作结果的最佳方法是什么?想象一个执行一些计算的线程,您如何警告主程序计算完成? 您可以每隔X毫秒轮询某个称为“作业完成”的公共变量或其他方式,但是随后您将在结果可用时才收到结果……主代码将浪费时间等待它们。另一方面,如果使用较低的X,则轮询将浪费CPU太多次。 因此,您如何做才能知道线程或某些线程已经完成了工作? 抱歉,如果它看起来与此其他问题相似,我想这可能是 ebe
给stackoverflow社区的人们。我正在寻找一些帮助,以解决HikariCP连接池面临的问题。 高级:我正在尝试使用线程池创建多个线程,我的计划是为每个工作线程提供独立于HikariCP的连接,但HikariCP所做的是在多个线程之间共享一个公共连接。我正在使用 以检索DB连接。现在,当我关闭一个连接时,我在其他线程中看到问题,说连接关闭了,线程正在处理的批次记录被丢弃。 以下是我的日志文件
问题内容: 我正在Android中编写一个活动,用户可以在其中修改SQL数据库。用户界面由一个EditText(用户在其中输入名称)和一个Seekbar(用户在其中输入用户的吸引力)组成。在下面有很多按钮:添加,编辑,查看,删除。 当用户单击“编辑”按钮时,将显示一个输入对话框,要求用户输入记录号。完成后,将加载该记录。 我遇到的问题是,将显示输入对话框,并且当用户输入记录号时,其余的编辑方法将继
我需要将我的Windows PC的屏幕流式传输到Android。我打算使用FFmpeg捕获屏幕,并使用H.264编解码器进行编码,通过RTP发送流,最后使用MediaCodec解码视频并显示在SurfaceView上。 然而,所有生成的NAL单元似乎都已损坏,原因是: > NAL单元报头的forbidden_zero_bit(最高有效位)为1。例如,下图所示NAL单元的报头(0x00 0x00 0
基于每个JVM的CPU核数创建线程与在多个JVM上运行的线程在CPU核数上创建线程数,条件是所有JVM运行在共享同一CPU的一个物理系统上有何不同?换句话说,一个并行运行8个线程的多线程Java程序vs在共享同一CPU的8个不同JVM上运行的同一多线程程序? 下面我给出了一些我发现的用线程实现并行处理的方法,但是我不能理解它们之间的本质区别? 方法一:线程周期性地查询数据库更改,并行地启动(长时间
问题内容: class mythread implements Runnable { 输出为: 但是我想要的输出就像首先应该在线程“ rohan”中打印5,然后在“ jain”中打印5,然后在线程“ main”中打印5,依此类推…请帮助.. !!!!!! 问题答案: 这些问题确实使我感到困惑。线程的全部要点是它们并行 异步 运行,因此我们可以获得更好的性能。由于硬件,竞争条件,时间分段随机性和其他
问题内容: 我在Glassfish 3.1.2.2上运行了许多MDB。由于在一个MDB上工作的性质,我需要使其成为单线程。我查看了《调优指南》,虽然将最大池大小设置为1确实可以解决问题,但这也意味着所有其他MDB都是单线程的。我真正想要实现的是将特定的MDB设为单线程,而将其他MDB设为多线程。 问题答案: 这可以通过glassfish-ejb- jar.xml 部署描述符轻松实现: 上一节将把处