我正在尝试优化一些慢速网页,我的猜测是问题与SQL阻塞有关(似乎不是Web服务器或数据库服务器上的CPU或I/O利用率问题).找出哪些查询被阻止以及哪些查询正在执行阻止的最快方法是什么?
我有一个奇怪的问题(至少对我来说:))与MySQL的锁定工具.
我有一张桌子:
create table `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)
有了这些数据:
+ ---- +
| id |
+ ---- +
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 10 |
| 11 |
| 12 |
+ ---- +
现在我有2个客户端在开头执行这些命令:
set autocommit = 0;
设置会话事务隔离级别可序列化;
开始;
现在最有趣的部分.第一个客户端执行此查询:(意图插入id等于9的行)
SELECT*from test where id = 9 FOR UPDATE;
空集(0.00秒)
然后第二个客户端做同样的事情:
SELECT*from test where …
我想发一个HTTP请求,然后按照草图在这里得到响应:
URLConnection c = new URL("http://foo.com").openConnection();
c.setDoOutput(true);
/* write an http request here using a new OutputStreamWriter(c.getOutputStream) */
BufferedReader reader = new BufferedReader(new InputStreamReader(c.getInputStream));
reader.readLine();
Run Code Online (Sandbox Code Playgroud)
但我的问题是,如果我发送的请求需要很长时间才能收到响应,那么上面的调用reader.readLine()会发生什么?此进程是否会在CPU上保持运行/可运行,还是会从CPU中取出并在有IO被读取时被通知唤醒并再次运行?
如果它停留在CPU上,可以做些什么让它下来并在以后得到通知?
我有一个托管在CMS(Squarespace)上的照片库页面,它有一些自己的脚本,可以异步加载缩略图.
然而,实际的大图像没有预加载,所以我决定将自己的脚本添加到混合中,只是让浏览器将这些较大的图像加载到后台的缓存中,如下所示:
(function($) {
var cache = [];
// Arguments are image paths relative to the current page.
$.preLoadImages = function() {
var args_len = arguments.length;
for (var i = args_len; i--;) {
var cacheImage = document.createElement('img');
cacheImage.src = arguments[i];
cache.push(cacheImage);
}
}
})(jQuery)
$(window).load(function(){
$.preLoadImages(
"/picture/1.jpg",
"/picture/2.jpg", //etc.
);
});
Run Code Online (Sandbox Code Playgroud)
我将我的代码放在$(window).load()中,因为这是一个后台脚本,它甚至根本不运行,它只是为了提高性能.
但是,我认为这个脚本以某种方式阻止了CMS自己的缩略图预加载脚本.
我对吗?最重要的是,有没有办法规定我的脚本只在页面上的所有其他脚本运行后运行?
干杯
这是功课.
我不想要解决方案,只需要少量的链接或想法.
简单地说我想做的是,
简单的例子:
public class Example
{
public void method()
{
int x = doThat();
//Call other methods which do not depend on x
return;
}
}
Run Code Online (Sandbox Code Playgroud)
doThat()是一种已知耗时的方法,这会导致程序阻塞,直到结果返回.我想使用此Object的不同方法,但程序frozen直到doThat()完成.这些不同的方法不必从method()本例中使用的方法调用,但可能来自对象外部.
我想过使用线程但是如果我有大量的对象(1000+),这可能不会非常有效(如果我错了请纠正我).我想如果我使用线程,我必须为每个对象使用一个线程?
除了线程之外还有其他方法可以使调用对象在调用时不被阻塞doThat();吗?如果线程是唯一的方法,你能提供链接吗?
知道这样的问题得到了投票我将接受任何downvotes.但请只是一个链接将是伟大的.
提前致谢.我希望问题符合规则.
我试图嘲笑一种方法,这种方法需要很长时间才能用于测试,但是无法在Javascript中找到一种很好的方法.除了编写一个非常长的for循环之外还有什么好方法
难道Event和Lock做这些场景是一回事吗?
class MyThread1(threading.Thread):
def __init__(event):
self.event = event
def run(self):
self.event.wait()
# do something
self.event.clear()
Run Code Online (Sandbox Code Playgroud)
另一个:
class MyThread2(threading.Thread):
def __init__(lock):
self.lock = lock
def run(self):
self.lock.acquire()
# do something
self.lock.release()
Run Code Online (Sandbox Code Playgroud) 我也将它发布到了Squeak Beginners列表中 - 我一定会确保从那里得到任何答案:)
我正在使用Squeak 4.2并处理命名管道连接的smalltalk端,该连接使用以下命令向命名管道服务器发送消息:
msg := 'Here''s Johnny!!!!'.
pipe nextPutAll: msg; flush.
Run Code Online (Sandbox Code Playgroud)
然后它应该收到一个确认,它将是收到的消息的32字节md5哈希值(smalltalk应用程序随后可以验证).命名管道服务器可能已经消失或者无法处理请求,因此我想在读取确认时设置超时.我试过用这个:
ack := [ pipe next: 32 ] valueWithin: (Duration seconds: 3) onTimeout: [ 'timeout'. ].
Run Code Online (Sandbox Code Playgroud)
然后使管道服务器人为地暂停以测试代码.但是smalltalk线程在读取时阻塞并且不进行(即使在超时之后),但是如果我然后让管道服务器发送正确的响应(例如在5秒延迟之后),则为'ack'的值'是'超时'.显然超时完成了它应该做的事情,但无法"解锁"管道上的阻塞读取.
有没有办法实现这一点,即使阻止FileStream读取?如果可能的话,我宁愿避免忙碌等待有32个字符可用.
关于同步 - 异步的概念,我在这里从阻塞和非阻塞操作(在OpenMPI中)的上下文中略微混淆了:
我已经完成了之前的同步 - 异步 - 阻塞 - stackoverflow上的非阻塞问题(异步与非阻塞),但对我没有帮助.我所知道的 :
MPI_Isend):方法返回并执行下一行 - >非阻塞MPI_Send):对于大型消息,它会阻塞直到传输完成那么如何以及为什么MPI_ISEND阻止(链接1)以及阻止(链接2)?这是异步和同步的意思MPI_Isend吗?
类似引起混淆关于MPI_Ssend&MPI_Issend中,由于小号在MPI_ 小号 SEND装置同步(或阻塞),并且: -
也是我 mmediate是非阻塞的,那么,怎样才能MPI_ IS SEND是小号 ynchronous&回到我 mmediately?
我想在阻塞和非阻塞OpenMPI通信的上下文中异步和同步需要更清晰.在这方面的实际例子或类比将是非常有用的.
我必须更新连接到串行端口的设备上的固件和设置.由于这是通过一系列命令完成的,因此我发送命令并等待直到我收到答案.在answere(多行)里面,我搜索一个字符串,指示操作是否成功完成.
Serial->write(“boot”, 1000);
Serial->waitForKeyword(“boot successful”);
Serial->sendFile(“image.dat”);
…
Run Code Online (Sandbox Code Playgroud)
所以我为这个阻塞读/写方法创建了一个新的Thread.在线程内部我使用了waitForX()函数.如果我调用watiForKeyword(),它将调用readLines()直到它检测到关键字或超时
bool waitForKeyword(const QString &keyword)
{
QString str;
// read all lines
while(serial->readLines(10000))
{
// check each line
while((str = serial->getLine()) != "")
{
// found!
if(str.contains(keyword))
return true;
}
}
// timeout
return false;
}
Run Code Online (Sandbox Code Playgroud)
readLines()读取所有可用的东西并将其分成行,每行放在一个QStringList中,并获取一个我调用getLine()的字符串,它返回列表中的第一个字符串并删除它.
bool SerialPort::readLines(int waitTimeout)
{
if(!waitForReadyRead(waitTimeout))
{
qDebug() << "Timeout reading" << endl;
return false;
}
QByteArray data = readAll();
while (waitForReadyRead(100))
data += readAll();
char* begin = data.data();
char* ptr = strstr(data, "\r\n");
while(ptr != NULL) …Run Code Online (Sandbox Code Playgroud) blocking ×10
asynchronous ×2
java ×2
javascript ×2
c++ ×1
io ×1
jquery ×1
locking ×1
mpi ×1
mysql ×1
named-pipes ×1
networking ×1
openmpi ×1
optimization ×1
performance ×1
preloading ×1
python ×1
qt ×1
serial-port ×1
smalltalk ×1
sql ×1
sql-server ×1
squeak ×1
synchronous ×1
timeout ×1