AFAIK当GC正在执行其操作时,VM会阻止所有正在运行的线程 - 或者至少在压缩堆时.这是CLR和JVM的现代实现中的情况(截至2010年1月的生产版本)?请不要提供有关GC的基本链接,因为我了解基本的工作原理.
我假设全局锁定就是这种情况,因为当压缩发生时,引用在移动期间可能是无效的,并且最简单的方法就是锁定整个堆(即,通过阻塞所有线程来间接).我可以想象更强大的机制,但KISS经常占上风.
如果我不正确,我的问题将通过对用于最小化阻塞的策略的简单解释来回答.如果我的假设是正确的,请提供以下两个问题的一些见解:
如果这确实是这种行为,那么像JBOSS和Glassfish这样的重量级企业引擎如何保持一致的高TPS率?我在JBOSS上做了一些谷歌搜索,我期待在APACHE上找到适合网络处理的内存分配器.
面对NUMA式架构(可能在不久的将来),这听起来像是一场灾难,除非进程受到线程和内存分配的CPU限制.
file_put_contents ( "file", "data", LOCK_EX )
Run Code Online (Sandbox Code Playgroud)
写作(意思是 - 获取锁定和写入)
file_get_contents ( "file", LOCK_EX )
Run Code Online (Sandbox Code Playgroud)
用于阅读(这意味着 - 获取锁定然后阅读)
它会抛出异常吗?提出错误?阻止直到获得锁定?或者至少 - 应该吗?有一天php会有这样的表现吗?
编辑:我知道可以使用重命名 - 我想知道答案...
假设我将数据写得非常快[我将内存中的所有数据]写入阻塞套接字.进一步假设对方将读取数据非常慢[如每次读取之间的睡眠时间为1秒].
在这种情况下,写作方面的预期行为是什么?写操作块是否会在另一侧读取足够的数据,否则写入会返回错误,如连接重置?
我可以很容易地在Node.js中编写非阻塞I/O. 这就是整个库的设置.
但任何完成的计算都是阻塞的.通过事件发射器传递的任何消息都是阻塞的.
例如,发射事件立即解决,因此阻塞:
var e = new process.EventEmitter;
e.on("foo", function() {
console.log("event");
});
process.nextTick(function() {
console.log("next tick");
});
setTimeout(function() {
console.log("timeout");
}, 0);
e.emit("foo");
> event
> next tick
> timeout
Run Code Online (Sandbox Code Playgroud)
除了包含调用之外nextTick,如何使代码无阻塞?
我希望尽可能少地在事件循环的每个周期进行计算,这样我就可以同时为多个客户端提供服务.
如何以非阻塞方式编写代码?
当我有非阻塞代码时,如何在多个进程中进行扩展?
一种选择是等待WebWorker子流程API完成.
如果我有一个程序创建并尝试使用mkfifo打开命名管道,如何打开管道进行读取或写入而不阻塞?
具体来说,我正在编写一个可以使用或不使用gui(用Java编写)运行的C程序.
在C程序中,我使用mkfifo成功创建了命名管道,但是当我这样做时
FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/
Run Code Online (Sandbox Code Playgroud)
在GUI打开该管道进行写入之前,fopen不会返回.我想做的是让管道准备好被读取一次(如果)GUI决定写入它 - 我将把文件描述符放在select()调用中.期望java GUI可能永远不会真正启动是合理的,所以我不能依赖它在任何特定点甚至根本不能打开管道的另一端.
我还将打开第二个管道进行写作,我想我会遇到同样的问题.此外,我不能在没有读卡器的输出管道上设置O_NONBLOCK.
有什么建议?
(这是在linux系统上运行的)
我对如何在python/twisted中编写异步代码感到有点困惑.假设(为了论证)我向世界公开一个函数,它接受一个数字并返回True/False,如果它是素数/非素数,所以它看起来像这样模糊:
def IsPrime(numberin):
for n in range(2,numberin):
if numberin % n == 0: return(False)
return(True)
Run Code Online (Sandbox Code Playgroud)
(只是为了说明).
现在假设有一个网络服务器需要根据提交的值调用IsPrime.这需要很长时间才能完成numberin.
如果同时另一个用户请求一个小数的素数,有没有办法使用reactor/deferreds架构异步运行两个函数调用,以便在长计算结果之前返回短计算结果?
我知道如果IsPrime功能来自我的网络服务器将执行延迟的getPage的其他一些网络服务器,该怎么做呢,但如果它只是一个本地功能呢?
即,可以在两次调用IsPrime之间以某种方式进行Twisted时间共享,还是需要显式调用新线程?
或者,IsPrime循环是否需要分成一系列较小的循环,以便控制可以快速传递回反应堆?
或者是其他东西?
我们试图解决的问题看起来像这样.
我们的解决方案是为卡分配状态,并存储它的预订日期.在预订卡时,我们使用"select for update"语句来完成.该查询查找可用的卡和很久以前保留的卡.
但是,我们的查询无法正常工作.
我准备了一个简化的情况来解释这个问题.我们有一个card_numbers表,充满了数据 - 所有行都有非空的id号.现在,让我们试着锁定其中一些.
-- first, in session 1
set autocommit off;
select id from card_numbers
where id is not null
and rownum <= 1
for update skip locked;
Run Code Online (Sandbox Code Playgroud)
我们不在此处提交事务,必须锁定行.
-- later, in session 2
set autocommit off;
select id from card_numbers
where id is not null
and rownum <= 1
for update skip locked;
Run Code Online (Sandbox Code Playgroud)
预期的行为是,在两个会话中,我们得到一个满足查询条件的不同行.
但是它不起作用.取决于我们是否使用查询的"跳过锁定"部分 - 行为更改:
因此,经过这么长时间的介绍就会出现问题.
Oracle中可能存在所需的锁定行为吗?如果是,那么我们做错了什么?什么是正确的解决方案?
我在我的项目中使用了一个可视化控件,它来自一个我没有源代码的库.
更新(大约200ms)以获得良好的UI响应时间需要很长时间,其中三个控件同时在屏幕上显示.(我可能需要一次更新所有三个,这使得我的UI在他们都在思考的时候停留了大约600毫秒).
我已经阅读了一些关于TaskSchedulers的帖子,并开始研究并行任务功能,作为在自己的线程中运行每个控件的一种方式.该平台将是多核的,所以我想利用同步处理.
问题是我甚至不知道我不知道如何解决这个问题.
是否有合适的设计模式用于在WPF中的主UI线程的单独线程中运行控件?
具体来说:它是第三方地图控件,当给定新位置或缩放级别时需要太长时间才能重绘(~200ms).可能有三个更新最多4Hz - 显然它们不会跟上..
我已经在用户控件中封装了WPF控件,并且需要在它自己的线程中运行每个实例,同时仍然捕获用户输入(鼠标点击, 例如).
更新:虽然我正在寻找解决方案,但到目前为止我已实施了以下内容.
我的主(UI)线程产生一个线程,该线程创建一个包含相关控件的新窗口,并将其定位在正确的位置(这样它看起来只是一个普通的控件).
_leftTopThread = new Thread(() =>
{
_topLeftMap = new MapWindow()
{
WindowStartupLocation = WindowStartupLocation.Manual,
Width = leftLocation.Width,
Height = leftLocation.Height,
Left = leftLocation.X,
Top = leftLocation.Y,
CommandQueue = _leftMapCommandQueue,
};
_topLeftMap.Show();
System.Windows.Threading.Dispatcher.Run();
});
_leftTopThread.SetApartmentState(ApartmentState.STA);
_leftTopThread.IsBackground = true;
_leftTopThread.Name = "LeftTop";
_leftTopThread.Start();
Run Code Online (Sandbox Code Playgroud)
哪个CommandQueue是线程安全的BlockingCollection队列,用于向地图发送命令(移动位置等).
现在的问题是,我可以任
System.Windows.Threading.Dispatcher.Run()呼叫而有用户输入我无法等待命令,因为它会吸收我所有的线程CPU!
是否有可能阻止并有事件消息泵的工作?
很多人可能都知道新的欧盟隐私法,但对于那些没有的人,它基本上意味着没有一个居住在欧盟的公司运营的网站可以设置被归类为"对网站运营不重要"的cookie在访客机器上,除非获得明确许可.
那么,问题就变成了如何最好地解决这个问题?
浏览器显然能够阻止内置于其中的特定网站的cookie.我的问题是,有没有办法使用JS或PHP做类似的事情?
即拦截可能试图设置的任何cookie(包括像Analytics或Facebook这样的第三方cookie),并阻止它们,除非用户已经同意.
显然有可能在设置完成后删除所有的cookie,但是虽然这相当于不允许它们首先被设置,但我猜它在这种情况下不够好,因为它没有坚持法律条文.
想法?