我正在运行一个多线程循环:
protected ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = 2;
Parallel.ForEach(items, parallelOptions, item =>
{
// Loop code here
});
我想在并行循环执行期间更改parallelOptions.MaxDegreeOfParallelism,以减少或增加线程数。
parallelOptions.MaxDegreeOfParallelism = 5;
好像没有增加线程。有人有什么想法吗?
最佳答案
即使尝试这样做,问题在于这是一个难题。对于初学者,您如何可靠地观察 CPU 和磁盘利用率?不频繁地对 CPU 进行采样将无法很好地了解实际发生的情况,而对磁盘利用率进行采样则更加困难。其次,您的任务的粒度是多少,您可以多久快速更改一次正在运行的数字。第三,事情会随着时间的推移而迅速变化,因此您需要对您的观察结果进行某种过滤。第四,理想的线程数取决于代码实际运行的 CPU。第五,如果您分配了太多线程,您将在它们之间来回奔波而不是做有用的工作。
参见 http://msdn.microsoft.com/en-us/magazine/ff960958.aspx有关 .NET 中的线程池如何处理决定使用多少线程的复杂任务的讨论。
您还可以使用反射器并查看 TPL 用于分配线程和避免不必要的上下文切换的代码 - 它很复杂,甚至没有考虑磁盘访问!
您可以改为尝试在优先级较低的线程上执行任务(创建您自己的 TaskScheduler 来运行优先级低于正常值的线程实际上非常容易)。这至少将确保您可以在不影响系统其余部分的情况下运行 100% 的 CPU。弄乱线程优先级本身就充满了问题,但如果这是一个纯粹的后台任务,它可以很简单并且可能有所帮助。
但通常情况下,当其他应用程序受到一个贪婪应用程序的影响时,磁盘利用率才是真正的罪魁祸首。 Windows 可以轻松地在应用程序之间公平地分配 CPU,但是当涉及到相对较慢的磁盘访问时,这就完全是另一回事了。与其尝试动态调整您正在运行的线程数,您可能需要简单地限制您的应用程序,使其不会过于频繁地访问磁盘。这是您可以在不更改事件线程数的情况下执行的操作。
您还可以将 SetPriorityClass 视为一种通知操作系统您的进程不如系统上运行的其他应用程序重要的方法,请参阅 How can I/O priority of a process be increased?了解更多信息。但这假设您的整个过程不那么重要,而不仅仅是这一部分。
关于c# - 是否可以在执行 Parallel.ForEach 期间更改 parallelOptions.MaxDegreeOfParallelism?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3705006/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查