F# 为什么任务没有分配给所有工人?
以下内容由ZeroMQ指南中的翻译而来F# 为什么任务没有分配给所有工人?,f#,netmq,F#,Netmq,以下内容由ZeroMQ指南中的翻译而来 模块ZeroMQ 开放系统 开放系统 开放系统。线程 开放系统.Threading.Tasks 开放NetMQ 打开NetMQ.Sockets 让我们并行_任务()= 让任务编号=100 让uri\u源、uri\u接收器= 让uri=”ipc://parallel_task" Path.Join(uri,“源”)、Path.Join(uri,“接收器”) printfn“%A,%A”uri\u源uri\u接收器 设rnd=Random() 使用源=新的Pu
模块ZeroMQ
开放系统
开放系统
开放系统。线程
开放系统.Threading.Tasks
开放NetMQ
打开NetMQ.Sockets
让我们并行_任务()=
让任务编号=100
让uri\u源、uri\u接收器=
让uri=”ipc://parallel_task"
Path.Join(uri,“源”)、Path.Join(uri,“接收器”)
printfn“%A,%A”uri\u源uri\u接收器
设rnd=Random()
使用源=新的PushSocket(uri\U源)
使用接收器=新的PushSocket(uri\U接收器)
让tasks=Array.init task\u编号(乐趣->rnd.Next 100+1)
让呼吸机_init()=
printf“工作人员准备就绪时按enter键。\n”
printf“总预期时间:%A\n”(TimeSpan.FromMillicles(Array.sum tasks |>float))
Console.ReadLine()|>忽略
让呼吸机运转()=
sink.SendFrame(“0”)
printf“正在向工作人员发送任务。\n”
Array.iter(字符串>>source.SendFrame)任务
线程。睡眠(1)
让我()=
printf“正在启动工作程序%i\n”i
use source=new PullSocket(uri\u source)
使用接收器=新的PushSocket(uri\U接收器)
尽管如此
让msg=source.ReceiveFrameString()
printf“Worker%i收到消息。\n”i
//打印文件“%s”。\n”消息
线程睡眠(int msg)
sink.SendFrame(“”)
让我们沉沦()=
使用接收器=新的PullSocket(uri\U接收器)
让watch=Diagnostics.Stopwatch()
对于i=1到任务编号do
let=sink.ReceiveFrameString()
如果watch.IsRunning=false,则watch.Start()
printf(如果i%10=0,则为“:”else“。)
printf“\n总运行时间:%A毫秒\n”手表。已运行
呼吸机_init()
对于i=1到4,执行任务。运行(工作者i)|>忽略
让t=Task.runsink
呼吸机运行()
t、 等等
[]
让主argv=
并行_任务()
0
这里发生的情况是,单个工作线程获得所有消息,而其他线程都没有被分配任何工作。为什么会发生这种情况?开放系统
开放系统
开放系统。线程
开放系统.Threading.Tasks
开放NetMQ
打开NetMQ.Sockets
让我们并行_任务()=
让任务编号=100
让uri\u源、uri\u接收器=
让uri=”ipc://parallel_task"
Path.Join(uri,“源”)、Path.Join(uri,“接收器”)
让呼吸机()=
设rnd=Random()
使用source=new PushSocket()
绑定(uri\u源)
使用sink=new PushSocket()
sink.Connect(uri\u sink)
让tasks=Array.init task\u编号(乐趣->rnd.Next 100+1)
printf“工作人员准备就绪时按enter键。\n”
printf“总预期时间:%A\n”(TimeSpan.FromMillicles(Array.sum tasks |>float))
Console.ReadLine()|>忽略
sink.SendFrame(“0”)
printf“正在向工作人员发送任务。\n”
Array.iter(字符串>>source.SendFrame)任务
线程。睡眠(1)
让我()=
printf“正在启动工作程序%i\n”i
使用source=new PullSocket()
source.Connect(uri\u源)
使用sink=new PushSocket()
sink.Connect(uri\u sink)
尽管如此
让msg=source.ReceiveFrameString()
printf“Worker%i收到消息。\n”i
线程睡眠(int msg)
sink.SendFrame(“”)
让我们沉沦()=
使用sink=new PullSocket()
sink.Bind(uri\u sink)
让watch=Diagnostics.Stopwatch()
对于i=1到任务编号do
let=sink.ReceiveFrameString()
如果watch.IsRunning=false,则watch.Start()
printf(如果i%10=0,则为“:”else“。)
printf“\n总运行时间:%A毫秒\n”手表。已运行
任务。运行呼吸机|>忽略
对于i=1到4,执行任务。运行(工作者i)|>忽略
Task.Run(sink.Wait())
这是上面的清理版本,可以正常工作。我必须明确指出什么是绑定,什么是连接。谢谢@somdoron的提示。签出,这是Netmq的f#绑定。您的接收器和源都是PushSocket,而工作程序是一推一拉。您是指
呼吸机
函数使用的吗?但实际上,他们也是这样。这里我遗漏了什么吗?试着使用bind和connect,而不是URI的构造函数,我认为当你打算连接和vise时,你需要绑定。是的,一旦我重写了示例,使套接字对绑定和连接敏感,它们就会正常工作。非常感谢你。