- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景
回复 question ,我建和uploaded a bounded-tchan (我不适合上传 jnb's version )。如果名称不够,则有界 tchan (BTChan) 是具有最大容量的 STM channel (如果 channel 已满则写入块)。
最近,我收到了添加像 regular TChan's 中的 dup 功能的请求。 .问题就这样开始了。
BTChan 的外观
下面是 BTChan 的简化(实际上是非功能性的) View 。
data BTChan a = BTChan
{ max :: Int
, count :: TVar Int
, channel :: TVar [(Int, a)]
, nrDups :: TVar Int
}
nrDups
) - 这是一个“单个元素计数器”,指示有多少读者获得了该元素。
count
的值递减以正确反射(reflect)信道上的可用容量。
c1
中读出所有项目。和
c2
.由于
c3
channel 仍然已满(剩余容量为 0)没有消耗它的副本。在任何时间点,如果所有对
c3
的引用被丢弃(所以
c3
被垃圾回收)然后容量应该被释放(在这种情况下恢复到 2)。
c <- newBTChan 1
_ <- dupBTChan c -- This represents what would probably be a pathological bug or terminated reader
writeBTChan c "hello"
_ <- readBTChan c
BTChan 1 (TVar 0) (TVar []) (TVar 1) --> -- newBTChan
BTChan 1 (TVar 0) (TVar []) (TVar 2) --> -- dupBTChan
BTChan 1 (TVar 1) (TVar [(2, "hello")]) (TVar 2) --> -- readBTChan c
BTChan 1 (TVar 1) (TVar [(1, "hello")]) (TVar 2) -- OH NO!
"hello"
的读取计数还在
1
?这意味着消息不会被认为消失(即使它会在实际实现中被 GCed)和我们的
count
永远不会递减。由于 channel 已满(最多 1 个元素),因此编写器将始终阻塞。
dupBTChan
叫做。当收集复制(或原始) channel 时,该 channel 上剩余要读取的所有元素将减少每个元素的计数,
nrDups
也是如此。变量将减少。因此, future 的写入将具有正确的
count
(a
count
不会为 GCed channel 未读取的变量保留空间)。
cancelBTChan
.我要让用户更难出错(并不是说手动管理在很多情况下都不是正确的方法)。
BTChan
是IO,我们可以
forkIO
在给定
BTChan
唯一的额外(虚拟)TVar 字段上读取/重试的线程.当对 TVar 的所有其他引用都被删除时,新线程将捕获异常,因此它将知道何时减少
nrDups
和单个元素计数器。这应该可以工作,但会强制我所有的用户使用 IO 来获取他们的
BTChan
s:
data BTChan = BTChan { ... as before ..., dummyTV :: TVar () }
dupBTChan :: BTChan a -> IO (BTChan a)
dupBTChan c = do
... as before ...
d <- newTVarIO ()
let chan = BTChan ... d
forkIO $ watchChan chan
return chan
watchBTChan :: BTChan a -> IO ()
watchBTChan b = do
catch (atomically (readTVar (dummyTV b) >> retry)) $ \e -> do
case fromException e of
BlockedIndefinitelyOnSTM -> atomically $ do -- the BTChan must have gotten collected
ls <- readTVar (channel b)
writeTVar (channel b) (map (\(a,b) -> (a-1,b)) ls)
readTVar (nrDup b) >>= writeTVar (nrDup b) . (-1)
_ -> watchBTChan b
addFinalizer
.那将是相同的解决方案,仍然强制使用 IO afaict。
initBTChanCollector
启动管理器线程,它将监视一组这些虚拟 TVar(来自解决方案 2)并进行所需的清理。基本上,它将 IO 推送到另一个线程中,该线程知道通过全局(
unsafePerformIO
ed)
TVar
做什么.事情基本上像解决方案2一样工作,但BTChan的创建仍然可以是STM。运行失败
initBTChanCollector
随着进程的运行,将导致不断增长的任务列表(空间泄漏)。
BTChan
s
BTChan
那么问题就消失了。
BTChan
来处理潜在的空间泄漏。 -那个chan应该有1的容量所以忘记运行
init
出现得非常快,但这是一个很小的变化。这适用于 GHCi (7.0.3) 但这似乎是偶然的。 GHC 向两个被阻塞的线程(读取 BTChan 和观察线程的有效线程)抛出异常,所以如果当另一个线程丢弃它的引用时你被阻塞读取 BTChan,那么你就会死。
最佳答案
这是另一种解决方案:要求对有界 channel 副本的所有访问都被一个在退出时释放其资源的函数括起来(通过异常或正常)。您可以使用带有 rank-2 runner 的 monad 来防止重复的 channel 泄漏。它仍然是手动的,但类型系统使得做淘气的事情变得更加困难。
您真的不想依赖真正的 IO 终结器,因为 GHC 无法保证终结器何时可以运行:据您所知,它可能会等到程序结束后再运行终结器,这意味着您已陷入僵局直到那时。
关于haskell - 如何在 TVar 上添加终结器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5446484/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!