Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 为什么任务没有分配给所有工人?_F#_Netmq - Fatal编程技术网

F# 为什么任务没有分配给所有工人?

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指南中的翻译而来

模块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时,你需要绑定。是的,一旦我重写了示例,使套接字对绑定和连接敏感,它们就会正常工作。非常感谢你。