itinero / routing

The routing core of itinero.
Apache License 2.0
222 stars 71 forks source link

GenerateInstructions and thread-safe #54

Closed amarinsek closed 7 years ago

amarinsek commented 7 years ago

Running route.GenerateInstructions() in parallel throws an exception

var routerDb = RouterDb.Deserialize(File.OpenRead(routerFile));
var router = new Router(routerDb);
Parallel.ForEach(Enumerable.Range(0, nbOfRuns), (x) =>
{
      route = router.Calculate(Vehicle.Car.Fastest(), fromCoord, toCoord));
      route.GenerateInstructions();
});

Ex: Cannot enter the same MoonSharp processor from two different threads : 1 and 7

   at Itinero.Profiles.Lua.Execution.VM.Processor.EnterProcessor() in D:\_gitlab\GitHub\itinero-routing\src\Itinero\Profiles\Lua\Execution\VM\Processor\Processor.cs:line 149
   at Itinero.Profiles.Lua.Execution.VM.Processor.Call(DynValue function, DynValue[] args) in D:\_gitlab\GitHub\itinero-routing\src\Itinero\Profiles\Lua\Execution\VM\Processor\Processor.cs:line 56
   at Itinero.Navigation.Instructions.DynamicUnimodalInstructionGenerator.<>c__DisplayClass4_0.<BuildTryGetDelegate>b__0(RoutePosition position, ILanguageReference language, Instruction& instruction) in D:\_gitlab\GitHub\itinero-routing\src\Itinero\Navigation\Instructions\DynamicUnimodalInstructionGenerator.cs:line 132
   at Itinero.Navigation.Instructions.UnimodalInstructionGenerator.DoRun() in D:\_gitlab\GitHub\itinero-routing\src\Itinero\Navigation\Instructions\UnimodalInstructionGenerator.cs:line 78
   at Itinero.Algorithms.AlgorithmBase.Run() in D:\_gitlab\GitHub\itinero-routing\src\Itinero\Algorithms\AlgorithmBase.cs:line 89
   at Itinero.Navigation.Instructions.DynamicUnimodalInstructionGenerator.Generate(Route route, ILanguageReference languageReference) in D:\_gitlab\GitHub\itinero-routing\src\Itinero\Navigation\Instructions\DynamicUnimodalInstructionGenerator.cs:line 348
   at Sample.Basic.Ales.<>c__DisplayClass0_0.<Main>b__2(Int32 x) in D:\_gitlab\GitHub\itinero-routing\samples\Sample.Basic\Ales.cs:line 130
   at System.Threading.Tasks.Parallel.<>c__DisplayClass42_0`2.<PartitionerForEachWorker>b__1()
   at System.Threading.Tasks.Task.InnerInvokeWithArg(Task childTask)
   at System.Threading.Tasks.Task.<>c__DisplayClass176_0.<ExecuteSelfReplicating>b__0(Object )
xivk commented 7 years ago

Aha! Ok, will have a look asap!