假设一些阻塞 I/O 是用 Java 完成的,例如长时间运行的数据库查询。Java 中是否有一种方法可以让某些 Java 数据库驱动程序告诉 JVM 调度程序该调用已离开 JVM,现在正在由某个外部系统处理?然后,JVM 可以将为数据库查询提供服务的线程分配给其他操作,直到数据库的回复到达。这样,阻塞数据库查询将有效地变为非阻塞。
只是想知道这是否可以在一般的 JVM 上完成。我从事 Java 工作很多年了,但我承认我不知道 Java 调度程序在这种情况下在做什么。
每当我需要发送消息时,我都会从线程调用这个函数 _write_port() 。为了确保写入整个消息,使用 tcdrain()。
void Serial_Port::_write_port(char *buf, unsigned &len)
{
// Lock
pthread_mutex_lock(&lock);
// Write packet via serial link
write(fd, buf, len);
// Wait until all data has been written
tcdrain(fd);
// Unlock
pthread_mutex_unlock(&lock);
return;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是 tcdrain() 在执行随机次数的函数 _write_port() 后永远阻塞。这将阻塞锁,导致阻塞我的其他读取线程,从而阻塞所有内容。
避免 tcdrain 永远阻塞的好方法是什么?
注意:我奇怪地注意到,如果我在整个函数中使用多个 printf(),tcdrain 永远不会阻塞。printf() 和 write() 之间存在关系对我来说没有任何意义,因为它们写入不同的输出文件。由于我无法解释这种行为,我认为它在我的实验中如此工作可能是巧合。如果有人可以解释这种行为,请告诉我。
我运行的网站流量不错(每天约有100,000次页面浏览量),但由于SQL Server超时错误,偶尔使该网站瘫痪。
当我运行SQL事件探查器时,我看到一条命令每秒被调用数百次,如下所示:
...
exec dbo.TempGetStateItemExclusive3 @id=N'ilooyuja4bnzodienj3idpni4ed2081b',...
...
Run Code Online (Sandbox Code Playgroud)
我们使用SQL Server来存储ASP.NET会话状态。上面是存储过程,用于获取给定会话的会话状态。它似乎在循环,一遍又一遍地请求相同的2或3个会话。
我发现了一个有前途的修补程序,似乎可以解决此确切问题,但似乎并没有为我们解决问题。(我假设此修补程序包含在最新的.NET Service Pack中,因为它看起来不再可以直接安装了)。我手动添加了注册表项,但是我们仍然看到像上面那样的循环存储过程调用(比每500ms频繁地请求相同的会话)
我无法在开发计算机上重新创建它。当对相同的会话ID发出两个请求时,它似乎可以正确阻止,甚至尝试命中SQL,直到第一页释放该会话。
有任何想法吗?先感谢您!!!
通常,您有一个绑定的tcp端口,并在这些端口上有多个连接。至少通常有更多的连接作为绑定端口。我的情况有所不同:我想绑定许多端口,并且通常没有(或至少很少有)连接。
所以我想使用NIO接受传入的连接。
但是,我需要将接受的连接传递给现有的jsch ssh库。这需要IO套接字而不是NIO套接字,它会为每个连接生成一个(或两个)线程。但这对我很好。
现在,我认为以下几行将提供相同的结果:
Socket a = serverSocketChannel.accept().socket();
Socket b = serverSocketChannel.socket().accept();
SocketChannel channel = serverSocketChannel.accept();
channel.configureBlocking( true );
Socket c = channel.socket();
Socket d = serverSocket.accept();
Run Code Online (Sandbox Code Playgroud)
但是,返回的套接字的getInputStream()和getOutputStream()功能似乎不同。仅当使用上一次调用接受套接字时,jsch才能使用它。在前三个案例中,它失败了(很抱歉:我不知道为什么)。
那么有没有办法转换这样的套接字?
假设我有一个类似这样的话题:
void my_thread(char *device_name) {
int fd = open(device_name, O_RDONLY);
struct input_event ev;
while(1) {
read(fd, &ev, sizeof(struct input_event));
/* do something */
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么停止这样的线程?一种方法是使用pthread_cancel,但我宁愿更优雅地做.还是喜欢pthread_kill什么?但是,在这种情况下,read方法是否会阻塞(正如我所假设的那样)以及线程如何处理信号?或者是应该处理它的过程?
我非常感谢你的建议!
我有一个侦听新连接的线程
new_fd = accept(Listen_fd, (struct sockaddr *) & their_addr, &sin_size);
Run Code Online (Sandbox Code Playgroud)
和另一个在关闭程序时关闭Listen_fd的线程.然而,在Listen_fd关闭后,它仍然会阻塞.当我使用GDB尝试和调试时,accept()不会阻塞.我认为这可能是SO_LINGER的问题,但默认情况下它不应该打开,并且在使用GDB时不应该更改.有什么想法,或关闭列表套接字的任何其他建议?
所以,我有一个很好的iOS应用程序 - 通常,除了偶尔阻止UI.有没有标准的技术来诊断零星无响应的用户界面?
在我的例子中,我有LRResty异步拉取数据,结果数据由NSXMLParser解析为一些NSMutableArray对象.
我将其固定在XML解析上,但UI不会一致地阻塞.它主要在点击我的UINavigationBar上的后退按钮后阻塞,但是在搜索栏与之交互之前,初始表格视图也不会滚动.可能有解析器仍在工作,或者请求仍在工作?
在我的国家,许多网站都会受到审查和阻止,而是被重定向到某个页面.我不知道他们是怎么做的.但是,如果不加载整个网站,是否可以以编程方式确定网站是否被阻止或未被阻止?我想这样做的原因是使用网络搜索API(可能是谷歌)并制作一个只带来未被阻止的结果的网络服务.
如果有帮助,加载的页面内容就像这样:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1256"><title>M3-5
</title></head><body><iframe src="http://10.10.34.34?type=Invalid Site&policy=MainPolicy " style="width: 100%; height: 100%" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" vspace="0" hspace="0"></iframe></body></html>
Run Code Online (Sandbox Code Playgroud)
我知道运行该服务的服务器必须拥有我国家的IP.
如果有一种方法可以在PHP或Python中执行此操作,那将是最好的.
我感谢任何帮助或想法.
我感兴趣的是OpenMPI中是否有命令或技术要进行原子调用以写入stdout(或者就此而言,任何流).
我注意到的是,在执行MPI程序期间,写入cout(或其他流)的调用可能会变得混乱,因为每当proc到达某段代码时,每个proc都可以写入.报告结果时,可以通过多个过程写入一行,这会使问题混乱.所以2个不同的过程可能会做这样的事情:
//Proc 10 - results calculated somewhere above
// result1 = 10
// result2 = 11
cout << "My results are: " << result1 << " " << resul2 << endl;
Run Code Online (Sandbox Code Playgroud)
和:
//Proc 20 - results calculated somewhere above
// result1 = 20
// result2 = 21
cout << "My results are: " << result1 << " " << resul2 << endl;
Run Code Online (Sandbox Code Playgroud)
但结果可能是:
My results are: 20 My results are: 10 11 21
Run Code Online (Sandbox Code Playgroud)
我正在寻找的东西就像"阻塞"或原子cout(以及可能写入其他流,如文件流).因此,一旦我开始编写一个cout,它就会阻塞直到语句结束,或者直到endl或者刷新流发出.如果是这种情况,我会保证两条线是分开的(当然,我仍然不知道哪条线会先出现):
My results are: 20 21 …Run Code Online (Sandbox Code Playgroud) 更新:如果我将ThreadPoolExecutor's核心池大小设置为与最大池大小(29个线程)相同,我发现我的程序仍然响应.但是,如果我将核心池大小设置为11并将最大池大小设置为29,那么actor系统只会创建11个线程.如何配置ActorSystem/ ThreadPoolExecutor继续创建线程以超过核心线程数并保持在最大线程数内?我宁愿不将核心线程数设置为最大线程数,因为我只需要额外的线程来取消作业(这应该是一个罕见的事件).
我有一个针对Oracle数据库运行的批处理程序,使用Java/Akka类型的actor与以下actor进行实现:
BatchManager负责与REST控制器通信.它管理一些Queue未初始化的批处理作业; 当从队列中轮询未初始化的批处理作业时,它将变为一个JobManageractor并执行.JobManager维护一个存储过程队列和一个池Workers; 它Worker使用存储过程初始化每个,并在Worker完成后将过程的结果发送给JobManager,JobManager并将另一个存储过程发送给Worker.当作业队列为空且全部Workers空闲时,批处理终止,此时将JobManager结果报告给BatchManager,关闭其工作人员(通过TypedActor.context().stop()),然后自行关闭.该JobManager有一个Promise<Status> completion在作业成功完成,否则当作业由于取消或致命异常终止调查结束.Worker执行存储过程.它创建OracleConnection和用于执行存储过程的CallableStatementonFailure,JobManager.completion并向abort连接和cancel语句注册回调.此回调不使用actor系统的执行上下文,而是使用从创建的高速缓存执行程序服务创建的执行上下文BatchManager.我的配置是
{"akka" : { "actor" : { "default-dispatcher" : {
"type" : "Dispatcher",
"executor" : "default-executor",
"throughput" : "1",
"default-executor" : { …Run Code Online (Sandbox Code Playgroud)