我在 Windows 应用程序中使用 SQLite3。我有源代码(所谓的 SQLite 合并)。
有时我必须执行繁重的查询。也就是说,我在准备好的语句上调用了 sqlite3_step,它需要很长时间才能完成(由于 I/O 负载很重)。
我想知道是否有可能中止这样的调用。如果能够在同一线程调用的中间进行一些后台处理,我也会很高兴(因为大部分时间都花在等待 I/O 完成上) .
我想过自己修改SQLite代码。在最简单的情况下,我可以在每次调用 ReadFile/WriteFile 之前检查一些条件(例如中止事件句柄),并适本地返回错误代码。并且为了允许后台处理,文件应该以重叠模式打开(这会启用异步 ReadFile/WriteFile)。
WriteFile 的中断是否有可能在某些情况下使数据库处于不一致状态,即使启用了日志?我猜不是,因为日志文件的整个想法是为任何类型的任何错误做好准备。但我想听听更多关于这个的意见。
还有,有人试过类似的东西吗?
提前致谢。
编辑:
感谢 ereOn。我不知道 sqlite3_interrupt 的存在。这可能回答了我的问题。
现在,对于所有想知道如何(以及为什么)在同一线程内的 I/O 期间进行一些后台处理的人来说。
不幸的是,没有多少人熟悉所谓的“重叠 I/O”。
http://en.wikipedia.org/wiki/Overlapped_I/O
使用它可以异步 发出 I/O 操作,并且调用线程不会阻塞。然后使用完成机制之一接收 I/O 完成状态:可等待事件、排队进入 APC 的新例程或完成端口。
使用这种技术不必创建额外的线程。实际上,创建线程的唯一真正合法性是当您的瓶颈是计算时间(即 CPU 负载)并且机器有多个 CPU(或内核)时。
并且创建一个线程只是让它在大多数时间被操作系统阻塞——这没有意义。这导致操作系统资源的不合理浪费,使程序复杂化(需要同步等)。
不幸的是,并不是所有的库/API 都允许异步操作模式,因此创建额外的线程必然是邪恶的。
编辑 2:
我已经找到了解决方案,感谢 ereOn。
对于那些仍然坚持认为在“等待”I/O 完成时使用重叠 I/O 不值得“在后台”做事的人。我不同意,我认为没有必要争论这个。至少这与主题无关。
我是一名 Windows 程序员(您可能已经注意到),并且在各种多任务处理方面拥有非常丰富的经验。另外,我还是一名驱动程序编写者,所以我也知道“幕后”的工作原理。
我知道创建多个线程来“并行”执行多项操作是一种“常见做法”。但这并不意味着这是一个好的做法。请允许我不遵循“惯例”。
最佳答案
我不明白为什么你希望中断来自同一个线程,我什至不明白这怎么可能:如果当前线程被阻塞,等待一些 IO ,您不能执行任何其他代码。 (是的,这就是“阻塞”的意思)
也许如果您向我们提供更多关于您为什么需要这个的提示,我们可能会提供进一步的帮助。
通常,我使用 sqlite3_interrupt()取消通话。但这显然涉及调用是从另一个线程进行的。
关于c++ - 有没有办法中止 SQLite 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3912417/
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle