Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[sumo-user] Address already in use: Race condition between isolated executions

Hi everyone

Trying to open two simulations with the same port hangs the entire execution, instead of raising an exception

Error
"Error: tcpip::Socket::accept() Unable to create listening socket: Address already in use
Quitting (on error)."


I'm currently running several experiments, simultaneously, in isolated docker containers. And inside every experiment, running several parallel simulations

The problem is that my experiments can step (and eventually does) into address conflict problems (race condition) and the hanging prevents any chance of retrying it with a new port, suspending the entire experiment forever.

The use of synchronization locks prevents address conflicts inside one experiment, so I'm basically limited to run one experiment at a time, which is very time consuming.


As a workaround, I'm going to specify port ranges for each simulation and check it for availability

Let me know if there is a better solution as workaround

And thank you in advance


P.S. I've included a trivial example to show the hanging behavior, but there is nothing special about it.


Sincerely,

Marcelo d'Almeida
 
import os
import sys

if 'SUMO_HOME' in os.environ:
    tools = os.path.join(os.environ['SUMO_HOME'], 'tools')
    sys.path.append(tools)
else:
    sys.exit("please declare environment variable 'SUMO_HOME'")

from os.path import expanduser

import traci
from sumolib import checkBinary

home = expanduser("~")

sys.path.append('traffic-light-optimization')


def get_sumo_binary(gui=False):

    if gui:
        sumo_binary = checkBinary('sumo-gui')
    else:
        sumo_binary = checkBinary('sumo')

    return sumo_binary

class Example:

    def __init__(self, net_file, route_file):

        self.net_file = net_file
        self.route_file = route_file

    def start_traci(self, gui=False):
        traci.start([
            get_sumo_binary(gui),
            '-n', self.net_file,
            '-r', self.route_file
        ], port=30000)

    def run_inner_model(self, label, initial_step):
        print('starting')
        gui = False

        from utils import sumo_util

        save_state = home + '/temp/simulation_state'
        time = initial_step

        net_xml = sumo_util.get_xml(self.net_file)
        stops_to_issue = sumo_util.fix_save_state_stops(net_xml, save_state, time)

        traci.start([
            get_sumo_binary(gui),
            '-n', self.net_file,
            '-r', self.route_file,
            '--start', str(True),
            '--quit-on-end', str(True),
            '--begin', str(initial_step),
            '--load-state', home + '/temp/simulation_state'
        ], label=label, port=30000)

        traci_connection = traci.getConnection(label)

        for stop_info in stops_to_issue:
            traci_connection.vehicle.setStop(**stop_info)

        i = 10
        while traci_connection.simulation.getMinExpectedNumber() > 0:
            traci_connection.simulationStep()

            if i == 0:
                break

            i -= 1

        traci_connection.close()
        traci.switch('default')

    def run_simulation(self):

        while traci.simulation.getMinExpectedNumber() > 0:

            step = traci.simulation.getTime()

            if step % 10 == 0:

                traci.simulation.saveState(home + '/temp/simulation_state')

                try:
                    traci.start([
                        get_sumo_binary(False),
                        '-n', self.net_file,
                        '-r', self.route_file,
                        '--start', str(True),
                        '--quit-on-end', str(True),
                        '--begin', str(step),
                        '--load-state', home + '/temp/simulation_state'
                    ], label=0, port=30000)
                except Exception as e:
                    print(str(e))

                traci_connection = traci.getConnection(0)

            traci.simulationStep()


net_file = home + '/temp/regular-intersection__right_on_red.net.xml'
route_file = home + '/temp/regular-intersection.rou.xml'

example = Example(net_file, route_file)
example.start_traci()
example.run_simulation()
traci.close()


Attachment: temp.zip
Description: Zip archive


Back to the top