- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在看this MSDN sample code并进行了一些调整以弄清楚如果受约束的资源(如演示中定义的)是“内存”并创建了一个、两个、四个或更多实例会发生什么。
例如, Main() 有一个定义的数量,可以增加或减少数量
networkResources.Post(new NetworkResource() { Name = "eth0" });
memoryResources.Post(new MemoryResource() { Name = "Memory01" });
fileResources.Post(new FileResource() { Name = "MFMHardDrive01" });
我还试图更多地了解 ActionBlock,特别是“资源被释放回其池”的行。该行是否只是对需要完成的额外工作的引用,因为它似乎只是像 while() 循环一样循环消息而没有结束,这使得这感觉类似于线程的 SpinWait()。
networkResources.Post(data.Item1);
memoryResources.Post(data.Item2);
为了更容易弄清楚这一点,我在输出中添加了颜色以使线程更容易识别。
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks.Dataflow;
// Demonstrates how to use non-greedy join blocks to distribute
// resources among a dataflow network.
class Program
{
// Represents a resource. A derived class might represent
// a limited resource such as a memory, network, or I/O
// device.
abstract class Resource
{
public object TeapotIsResource { get; set; }
public int TouchCount { get; set; }
}
// Represents a memory resource. For brevity, the details of
// this class are omitted.
class MemoryResource : Resource
{
public MemoryResource()
{
NetworkSequenceID = ran.Next();
}
Random ran = new Random((int)DateTime.Now.Ticks);
public int NetworkSequenceID { get; set; }
public object TeapotIsMemory { get; set; }
public string Name { get; set; }
}
// Represents a network resource. For brevity, the details of
// this class are omitted.
class NetworkResource : Resource
{
public NetworkResource()
{
NetworkSequenceID = ran.Next();
}
Random ran = new Random((int)DateTime.Now.Ticks);
public int NetworkSequenceID { get; set; }
public object TeapotIsNetwork { get; set; }
public string Name { get; set; }
}
// Represents a file resource. For brevity, the details of
// this class are omitted.
class FileResource : Resource
{
public FileResource()
{
NetworkSequenceID = ran.Next();
}
Random ran = new Random((int)DateTime.Now.Ticks);
public int NetworkSequenceID { get; set; }
public string Name { get; set; }
}
public static DateTime TimeForFile = DateTime.UtcNow;
public static DateTime TimeForNetwork = DateTime.UtcNow;
static int NetworkSequenceID = 0;
static void Main(string[] args)
{
Console.ForegroundColor = ConsoleColor.White;
colorMap.Add(867);
// Create three BufferBlock<T> objects. Each object holds a different
// type of resource.
var networkResources = new BufferBlock<NetworkResource>();
var fileResources = new BufferBlock<FileResource>();
var memoryResources = new BufferBlock<MemoryResource>();
// Create two non-greedy JoinBlock<T1, T2> objects.
// The first join works with network and memory resources;
// the second pool works with file and memory resources.
var joinNetworkAndMemoryResources =
new JoinBlock<NetworkResource, MemoryResource>(
new GroupingDataflowBlockOptions
{
Greedy = false,
});
var joinFileAndMemoryResources =
new JoinBlock<FileResource, MemoryResource>(
new GroupingDataflowBlockOptions
{
Greedy = false,
});
// Create two ActionBlock<T> objects.
// The first block acts on a network resource and a memory resource.
// The second block acts on a file resource and a memory resource.
var networkMemoryAction =
new ActionBlock<Tuple<NetworkResource, MemoryResource>>(
data =>
{
// Perform some action on the resources.
// Print a message.
PrintLine("Network worker", data.Item1.Name, data.Item1.NetworkSequenceID, networkResources.Count,
"using resources on", data.Item2.Name, data.Item2.NetworkSequenceID, memoryResources.Count);
// Simulate a lengthy operation that uses the resources.
Thread.Sleep(2000);
// Print a message.
PrintLine("Network worker", data.Item1.Name, data.Item1.NetworkSequenceID, networkResources.Count,
"finished using resources on", data.Item2.Name, data.Item2.NetworkSequenceID, memoryResources.Count);
data.Item1.TouchCount = data.Item1.TouchCount + 1;
data.Item2.TouchCount = data.Item2.TouchCount + 1;
if (data.Item2.TouchCount == 10)
{
Console.WriteLine(DateTime.UtcNow - TimeForNetwork);
}
networkResources.Post(data.Item1);
memoryResources.Post(data.Item2);
});
var fileMemoryAction =
new ActionBlock<Tuple<FileResource, MemoryResource>>(
data =>
{
// Perform some action on the resources.
// Print a message.
PrintLine("File worker", data.Item1.Name, data.Item1.NetworkSequenceID, fileResources.Count,
"using resources on", data.Item2.Name, data.Item2.NetworkSequenceID, memoryResources.Count);
// Simulate a lengthy operation that uses the resources.
//Thread.Sleep(new Random().Next(500, 2000));
Thread.Sleep(2000);
// Print a message.
PrintLine("File worker", data.Item1.Name, data.Item1.NetworkSequenceID, fileResources.Count,
"finished using resources on", data.Item2.Name, data.Item2.NetworkSequenceID, memoryResources.Count);
data.Item1.TouchCount = data.Item1.TouchCount + 1;
data.Item2.TouchCount = data.Item2.TouchCount + 1;
if (data.Item2.TouchCount == 10 )
{
Console.WriteLine(DateTime.UtcNow - TimeForFile);
}
// Release the resources back to their respective pools.
fileResources.Post(data.Item1);
memoryResources.Post(data.Item2);
});
// Link the resource pools to the JoinBlock<T1, T2> objects.
// Because these join blocks operate in non-greedy mode, they do not
// take the resource from a pool until all resources are available from
// all pools.
networkResources.LinkTo(joinNetworkAndMemoryResources.Target1);
memoryResources.LinkTo(joinNetworkAndMemoryResources.Target2);
fileResources.LinkTo(joinFileAndMemoryResources.Target1);
memoryResources.LinkTo(joinFileAndMemoryResources.Target2);
// Link the JoinBlock<T1, T2> objects to the ActionBlock<T> objects.
joinNetworkAndMemoryResources.LinkTo(networkMemoryAction);
joinFileAndMemoryResources.LinkTo(fileMemoryAction);
// Populate the resource pools. In this example, network and
// file resources are more abundant than memory resources.
Console.WriteLine("ADDING: Allocating 4 Network interfaces");
networkResources.Post(new NetworkResource() { Name = "eth0" });
networkResources.Post(new NetworkResource() { Name = "eth1" });
//networkResources.Post(new NetworkResource() { Name = "eth2" });
//networkResources.Post(new NetworkResource() { Name = "eth3" });
Console.WriteLine("ADDING: Allocate a small memory resource");
memoryResources.Post(new MemoryResource() { Name = "Memory01" });
memoryResources.Post(new MemoryResource() { Name = "Memory02" });
Console.WriteLine("ADDING: Old disk technology simulator ");
fileResources.Post(new FileResource() { Name = "MFMHardDrive01" });
//fileResources.Post(new FileResource() { Name = "MFMHardDrive02" });
// Allow data to flow through the network for several seconds.
Thread.Sleep(10000000);
}
public static void MessageProcessor(string from)
{
}
private static void PrintLine(string workerType, string dataItem1Name, int networkSequenceID1, int count1, string onString, string item2Name, int networkSequenceID2, int count2)
{
// Many threads writing to console
lock (colorMap)
{
int fixAPICountingAtZero = 1;
Console.Write(workerType + " " + dataItem1Name + "/");
SetConsoleColor(networkSequenceID1);
Console.Write("(" + (count1 + fixAPICountingAtZero) + "): " + onString + item2Name + "/");
SetConsoleColor(networkSequenceID2);
Console.WriteLine(" (" + (count2 + fixAPICountingAtZero) + ")");
}
}
static List<int> colorMap = new List<int>();
static string SetConsoleColor(int anumber)
{
if (!colorMap.Contains(anumber))
{
colorMap.Add(anumber);
}
var original = Console.ForegroundColor;
Console.ForegroundColor = (ConsoleColor)colorMap.IndexOf(anumber);
Console.Write(anumber);
Console.ForegroundColor = original;
return "";
}
}
/* Sample output:
File worker: using resources...
File worker: finished using resources...
Network worker: using resources...
Network worker: finished using resources...
File worker: using resources...
File worker: finished using resources...
Network worker: using resources...
Network worker: finished using resources...
File worker: using resources...
File worker: finished using resources...
File worker: using resources...
File worker: finished using resources...
Network worker: using resources...
Network worker: finished using resources...
Network worker: using resources...
Network worker: finished using resources...
File worker: using resources...
*/
最佳答案
如果我正确理解问题。
我能看到的第一个问题是 ActionBlock
如果未设置,构造函数可以采用默认为以下的选项。
ExecutionDataflowBlockOptions
When specific configuration options are not set, the followingdefaults are used:
OptionsDefault
- TaskScheduler : Default
- CancellationToken :None
- MaxMessagesPerTask :DataflowBlockOptions.Unbounded (-1)
- BoundedCapacity : DataflowBlockOptions.Unbounded (-1)
- MaxDegreeOfParallelism : 1
ActionBlock
上设置选项明确地,由于
MaxDegreeOfParallelism
的事实,它将被限制为串行处理消息。默认为
1
示例
var blobk = new ActionBlock<T>(
x => {...},
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = <something that makes sense to your solution>
});
备注 :您当前的实现使用同步工作流。要真正打开 Dataflow 管道的性能和可扩展性,您需要确保使用
Func<Task>
为任何 IO 绑定(bind)的工作负载委托(delegate)重载并利用 async 和 await 模式。
关于c# - 寻找关于 MSDN TPL 数据流示例和并行化的清晰度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65152242/
我是 python 的新手。我试图找到我的文本的频率分布。这是代码, import nltk nltk.download() import os os.getcwd() text_file=open(
我对安卓 fragment 感到困惑。我知道内存 fragment 但无法理解什么是 android fragment 问题。虽然我发现很多定义,比如 Android fragmentation re
尝试对 WordPress 进行 dockerise 我发现了这个场景: 2个数据卷容器,一个用于数据库(bbdd),另一个用于wordpress文件(wordpress): sudo docker
这个问题已经有答案了: From the server is there a way to know that my page is being loaded in an Iframe (1 个回答)
我正在玩小型服务器,试图对运行在其上的服务进行docker化。为简化起见,假设我必须主要处理:Wordpress和另一项服务。 在Docker集线器上有许多用于Wordpress的图像,但是它们似乎都
我想要发生的是,当帐户成功创建后,提交的表单应该消失,并且应该出现一条消息(取决于注册的状态)。 如果成功,他们应该会看到一个简单的“谢谢。请检查您的电子邮件。” 如果不是,那么他们应该会看到一条适当
就是这样,我需要为客户添加一个唯一标识符。通过 strip 元数据。这就是我现在完全构建它的方式,但是我只有最后一部分告诉我用户购买了哪个包。 我试着看这里: Plans to stripe 代码在这
我有一个类将执行一些复杂的操作,涉及像这样的一些计算: public class ComplexAction { public void someAction(String parameter
这个问题已经有答案了: maven add a local classes directory to module's classpath (1 个回答) 已关闭10 年前。 我有一些不应更改的旧 E
我使用 fragment 已经有一段时间了,但我经常遇到一个让我烦恼的问题。 fragment 有时会相互吸引。现在,我设法为此隔离了一个用例,它是这样的: Add fragment A(也使用 ad
我的 html 中有一个 ol 列表,上面有行条纹。看起来行条纹是从数字后面开始的。有没有办法让行条纹从数字开始? 我已经包含了正在发生的事情的片段 h4:nth-child(even) {
如何仅使用 css 将附加图像 html 化? 如果用纯 css 做不到,那我怎么能至少用一个图像来做 最佳答案 这不是真正的问题,而是您希望我们为您编写代码。我建议您搜索“css breadcrum
以下是 Joshua 的 Effective Java 的摘录: If you do synchronize your class internally, you can use various te
在这里工作时,我们有一个框向业务合作伙伴提供 XML 提要。对我们的提要的请求是通过指定查询字符串参数和值来定制的。其中一些参数是必需的,但很多不是。 例如,我们要求所有请求都指定一个 GUID 来标
我有 3 个缓冲区,其中包含在 32 位处理器上运行的 R、G、B 位数据。 我需要按以下方式组合三个字节: R[0] = 0b r1r2r3r4r5r6r7r8 G[0] = 0b g1g2g3g4
我最近发现了关于如何使用 History.js、jQuery 和 ScrollTo 通过 HTML5 History API 对网站进行 Ajax 化的要点:https://github.com/br
我们有一个 Spring Boot 应用程序,由于集成需要,它变得越来越复杂——比如在你这样做之后发送一封电子邮件,或者在你之后广播一条 jms 消息等等。在寻找一些更高级别的抽象时,我遇到了 apa
我正在尝试首次实施Google Pay。我面临如何指定gateway和gatewayMarchantId的挑战。 我所拥有的是google console帐户,不知道在哪里可以找到此信息。 priva
昨天下午 3 点左右,我为两个想要从一个 Azure 帐户转移到另一个帐户的网站设置了 awverify 记录。到当天结束时,Azure 仍然不允许我添加域,所以我赌了一把,将域和 www 子域重新指
我正在使用terms facet在elasticsearch服务器中获取顶级terms。现在,我的标签"indian-government"不被视为一个标签。将其视为"indian" "governm
我是一名优秀的程序员,十分优秀!