当连接到终端时,stdout是行缓冲的,但我记得在某处读取(至少从stdin)将自动刷新stdout.我使用的所有C实现都已经完成了,但我现在无法在标准中找到它.
它确实有意义,它是这样的,否则代码如下:
printf("Type some input: ");
fgets(line, sizeof line, stdin);
Run Code Online (Sandbox Code Playgroud)
需要一个额外的 fflush(stdout);
那么stdout肯定会在这里刷新吗?
编辑:
正如几个回复所说,标准中似乎无法保证我的示例中的stdout输出将在从stdin读取之前出现,但另一方面,这个意图在(我的免费草稿副本)中说明了标准:
交互设备的输入和输出动态应按照7.19.3的规定进行.这些要求的目的是尽快出现无缓冲或行缓冲输出,以确保在程序等待输入之前实际出现提示消息.
(ISO/IEC 9899:TC2委员会草案 - 2005年5月6日,第14页).
所以似乎没有保证,但无论如何它可能适用于大多数实现.(著名遗言...)
有没有人知道如何从Windows命令行刷新当前目录(或任何给定文件或目录)的缓存管理器中的磁盘写入缓存数据?
<?php
for($i=0;$i<20;$i++)
{
echo 'printing...<br />';
ob_flush();
flush();
usleep(300000);
}
?>
Run Code Online (Sandbox Code Playgroud)
包含以下代码的网址:http://domainsoutlook.com/sandbox/delayed.php
我有一个专用服务器,所以我可以进行更改.我正在运行apache和nginx作为代理服务器.
许多iOS开发人员已经找到了Cocoa Lumberjack Logging框架来满足简单NSLog语句不需要的需求.它让人想起Java世界中的Log4J.
无论如何,我已经为Lumberjack编写了自己的自定义格式化程序,但我没有看到任何关于如何立即刷新日志语句的文档.
例如,如果我正在浏览调试器并且我点击了一个NSLog()语句,它会立即将日志语句刷新到控制台.这是我想从DDLogVerbose()Lumberjack 的电话中得到的行为.
现在,我回过头来将这些语句更改为NSLog()语句,如果我希望它们在我调试一段代码时立即吐出来.随着伐木工人如此强大,我开始认为有一种方法可以将其配置为毫不拖延地进行冲洗.
有谁知道如何做到这一点?
我正在使用该subprocess模块从python启动进程.我希望能够在写入/缓冲后立即访问输出(stdout,stderr).
例如,假设我想运行一个名为counter.pyvia a 的python文件subprocess.内容counter.py如下:
import sys
for index in range(10):
# Write data to standard out.
sys.stdout.write(str(index))
# Push buffered data to disk.
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
负责执行该counter.py示例的父进程如下:
import subprocess
command = ['python', 'counter.py']
process = subprocess.Popen(
cmd,
bufsize=1,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
Run Code Online (Sandbox Code Playgroud)
使用该counter.py示例,我可以在流程完成之前访问数据.这很棒!这正是我想要的.但是,删除该sys.stdout.flush()调用会阻止在我想要的时间访问数据.这是不好的!这正是我不想要的.我的理解是flush()调用强制将数据写入磁盘,在将数据写入磁盘之前,它只存在于缓冲区中.请记住,我希望能够运行任何进程.我不希望这个过程执行这种刷新,但我仍然期望数据可以实时(或接近它).有没有办法实现这个目标?
关于父进程的快速说明.您可能会注意到我正在使用bufsize=0线路缓冲.我希望这会导致每行的磁盘刷新,但它似乎不会那样工作.这个论点如何运作?
您还会注意到我正在使用subprocess.PIPE.这是因为它似乎是在父进程和子进程之间生成IO对象的唯一值.我通过查看模块中的Popen._get_handles方法得出了这个结论subprocess(我在这里指的是Windows定义).有两个重要的变量,c2pread而c2pwrite …
我在MacOSX上.
在我的应用程序的记录器部分,我正在将数据转储到文件中.
假设我有一个全局声明 std::ofstream outFile("log");
在我的日志代码中我有:
outFile << "......." ;
outFile.flush();
Run Code Online (Sandbox Code Playgroud)
现在,假设我的代码在flush()发生后崩溃了; 是否保证写入磁盘outFile之前写入的东西flush()(请注意,我不会调用a close()).
谢谢!
我有一个示例项目使用spring-bootwith spring-data-jpa和postgres db一个表.
我正在尝试将INSERT10 000条记录循环到表中并测量执行时间 - 为每100条记录启用或禁用类的flush()方法EntityManager.
预期的结果是启用flush()方法的执行时间比使用禁用的方法要少得多,但实际上我得到了相反的结果.
UserService.java
package sample.data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
UserRepository userRepository;
public User save(User user) {
return userRepository.save(user);
}
}
Run Code Online (Sandbox Code Playgroud)
UserRepository.java
package sample.data;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> { }
Run Code Online (Sandbox Code Playgroud)
Application.java
package sample;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.annotation.Transactional;
import sample.data.User; …Run Code Online (Sandbox Code Playgroud) 我在Python 3.1上编写了一个简单的程序,我偶然发现了这个:
如果我在IDLE上运行它,它按预期工作 - 打印"Initializing."然后添加两个点,每秒一个,并等待输入.
from time import sleep
def initialize():
print('Initializing.', end='')
sleep(1)
print(" .", end='')
sleep(1)
print(" .", end='')
input()
initialize()
Run Code Online (Sandbox Code Playgroud)
问题是,当我双击.py来执行文件时,它运行在python.exe而不是pythonw.exe上,并发生奇怪的事情:它一直加入,sleep()即让我等待2秒,然后打印整个字符串Initializing. . .一下子.为什么会这样?有没有办法避免终端发生这种情况?如果我在windows和linux中使用IDLE,它工作正常.
我最近切换操作系统,并使用更新的Python(2.7).在我的旧系统上,我曾经能够即时打印.例如,假设我有一个计算密集的for循环:
for i in range(10):
huge calculation
print i
Run Code Online (Sandbox Code Playgroud)
然后当代码完成每次迭代时,它会打印出来 i
但是,在我当前的系统上,python似乎缓存了标准输出,以便终端空白几分钟,然后打印:
1 2 3
简而言之.然后,再过几分钟,它会打印出来:
4 5 6
等等.如何在print声明到达声明后立即进行python打印?
我经常看到,tqdm进度条被其他打印件打破,例如:
93%|??????????| 28/30 [00:02<00:00, 13.44it/s]Subject S9
100%|??????????| 30/30 [00:02<00:00, 12.94it/s]
93%|??????????| 28/30 [00:02<00:00, 11.49it/s]Pickling...
100%|??????????| 30/30 [00:02<00:00, 11.47it/s]
Run Code Online (Sandbox Code Playgroud)
这里应该只显示 2 个进度条。尽管如此成功,打印一些文本会以很高的百分比中断进度条,其余的会在之后打印出来。
是否可以以某种方式“刷新”进度条?
我读过,默认情况下会tqdm打印stderr并尝试刷新它
sys.stderr.flush()
Run Code Online (Sandbox Code Playgroud)
但这没有帮助。
以上都是在PyCharm控制台模拟中发生的,所以可以与此相关。