diff --git a/CHANGES.md b/CHANGES.md
index 033eccb..e03a520 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,6 +1,7 @@
 ### 2.2.0.dev0 (in development)
 
 - Fix bad interaction between `max_workers=None` and `reuse='auto'` (#132).
+- Add initializer for `get_reusable_executor` (#134)
 
 ### 2.1.2 - 2018-06-04 - Release Highligths
 
diff --git a/examples/deadlock_results.py b/examples/deadlocks/deadlock_results.py
similarity index 95%
rename from examples/deadlock_results.py
rename to examples/deadlocks/deadlock_results.py
index dc11ba6..d1de4cb 100644
--- a/examples/deadlock_results.py
+++ b/examples/deadlocks/deadlock_results.py
@@ -1,4 +1,5 @@
 """Deadlock with unpickling error for the result
+=================================================
 
 This example highlights the fact that the ProcessPoolExecutor implementation
 from concurrent.futures is not robust to pickling error (at least in versions
diff --git a/examples/deadlock_timeout_shutdown.py b/examples/deadlocks/deadlock_timeout_shutdown.py
similarity index 95%
rename from examples/deadlock_timeout_shutdown.py
rename to examples/deadlocks/deadlock_timeout_shutdown.py
index 419467b..ba5a7e0 100644
--- a/examples/deadlock_timeout_shutdown.py
+++ b/examples/deadlocks/deadlock_timeout_shutdown.py
@@ -1,4 +1,5 @@
 """Deadlock with pickling errors
+================================
 
 This example highlights the fact that the ProcessPoolExecutor implementation
 from concurrent.futures is not robust to pickling error (at least in versions
diff --git a/examples/reuseable_executor.py b/examples/reuseable_executor.py
new file mode 100644
index 0000000..36833c3
--- /dev/null
+++ b/examples/reuseable_executor.py
@@ -0,0 +1,42 @@
+"""
+Advanced Executor Setup
+=======================
+
+It is possible to reuse an executor even if it has a complicated setup. When
+using the parameter `reuse=True`, the executor is resized if needed but the
+arguments stay the same.
+"""
+from time import sleep
+from loky import get_reusable_executor
+
+INITIALIZER_STATUS = "uninitialized"
+
+
+def initializer(self, x):
+    global INITIALIZER_STATUS
+    INITIALIZER_STATUS = x
+
+
+def test_initializer(self, delay=0):
+    print(delay)
+    sleep(delay)
+
+    global INITIALIZER_STATUS
+    return INITIALIZER_STATUS
+
+
+executor = get_reusable_executor(
+    max_workers=2, initializer=initializer, initargs=('initialized',))
+
+assert executor.submit(test_initializer).result() == 'initialized'
+
+# With reuse=True, the executor use the same initializer
+executor = get_reusable_executor(max_workers=4, reuse=True)
+for x in executor.map(test_initializer, delay=.5):
+    assert x == 'initialized'
+
+# With reuse='auto', the initializer is not used anymore as a new executor is
+# created.
+executor = get_reusable_executor(max_workers=4)
+for x in executor.map(test_initializer, delay=.1):
+    assert x == 'uninitialized'
diff --git a/loky/reusable_executor.py b/loky/reusable_executor.py
index 881ec83..30b217f 100644
--- a/loky/reusable_executor.py
+++ b/loky/reusable_executor.py
@@ -38,8 +38,9 @@ def _get_next_executor_id():
 
 
 def get_reusable_executor(max_workers=None, context=None, timeout=10,
-                          kill_workers=False, job_reducers=None,
-                          result_reducers=None, reuse="auto"):
+                          kill_workers=False, reuse="auto",
+                          job_reducers=None, result_reducers=None,
+                          initializer=None, initargs=()):
     """Return the current ReusableExectutor instance.
 
     Start a new instance if it has not been started already or if the previous
@@ -69,9 +70,12 @@ def get_reusable_executor(max_workers=None, context=None, timeout=10,
 
     The ``job_reducers`` and ``result_reducers`` are used to customize the
     pickling of tasks and results send to the executor.
+
+    When provided, the ``initializer`` is run first in newly spawned
+    processes with argument ``initargs``.
     """
     with _executor_lock:
-        global _executor, _executor_args
+        global _executor, _executor_kwargs
         executor = _executor
 
         if max_workers is None:
@@ -84,25 +88,27 @@ def get_reusable_executor(max_workers=None, context=None, timeout=10,
                 "max_workers must be greater than 0, got {}."
                 .format(max_workers))
 
-        args = dict(context=context, timeout=timeout,
-                    job_reducers=job_reducers, result_reducers=result_reducers)
         if isinstance(context, STRING_TYPE):
             context = get_context(context)
         if context is not None and context.get_start_method() == "fork":
             raise ValueError("Cannot use reusable executor with the 'fork' "
                              "context")
+
+        kwargs = dict(context=context, timeout=timeout,
+                      job_reducers=job_reducers,
+                      result_reducers=result_reducers,
+                      initializer=initializer, initargs=initargs)
         if executor is None:
             mp.util.debug("Create a executor with max_workers={}."
                           .format(max_workers))
             executor_id = _get_next_executor_id()
-            _executor_args = args
+            _executor_kwargs = kwargs
             _executor = executor = _ReusablePoolExecutor(
-                _executor_lock, max_workers=max_workers, context=context,
-                timeout=timeout, executor_id=executor_id,
-                job_reducers=job_reducers, result_reducers=result_reducers)
+                _executor_lock, max_workers=max_workers,
+                executor_id=executor_id, **kwargs)
         else:
             if reuse == 'auto':
-                reuse = args == _executor_args
+                reuse = kwargs == _executor_kwargs
             if (executor._flags.broken or executor._flags.shutdown
                     or not reuse):
                 if executor._flags.broken:
@@ -116,10 +122,10 @@ def get_reusable_executor(max_workers=None, context=None, timeout=10,
                     "previous instance cannot be reused ({})."
                     .format(max_workers, reason))
                 executor.shutdown(wait=True, kill_workers=kill_workers)
-                _executor = executor = _executor_args = None
+                _executor = executor = _executor_kwargs = None
                 # Recursive call to build a new instance
                 return get_reusable_executor(max_workers=max_workers,
-                                             **args)
+                                             **kwargs)
             else:
                 mp.util.debug("Reusing existing executor with max_workers={}."
                               .format(executor._max_workers))
@@ -131,11 +137,11 @@ def get_reusable_executor(max_workers=None, context=None, timeout=10,
 class _ReusablePoolExecutor(ProcessPoolExecutor):
     def __init__(self, submit_resize_lock, max_workers=None, context=None,
                  timeout=None, executor_id=0, job_reducers=None,
-                 result_reducers=None):
+                 result_reducers=None, initializer=None, initargs=()):
         super(_ReusablePoolExecutor, self).__init__(
             max_workers=max_workers, context=context, timeout=timeout,
-            job_reducers=job_reducers,
-            result_reducers=result_reducers)
+            job_reducers=job_reducers, result_reducers=result_reducers,
+            initializer=initializer, initargs=initargs)
         self.executor_id = executor_id
         self._submit_resize_lock = submit_resize_lock
 

initializer for get_reusable_executor
It is possible to set `initializer` for `ProcessPoolExecutor` but I could not find how to pass an initializer to `get_reusable_executor`. 
diff --git a/tests/test_reusable_executor.py b/tests/test_reusable_executor.py
index 76e1aef..85385bf 100644
--- a/tests/test_reusable_executor.py
+++ b/tests/test_reusable_executor.py
@@ -43,6 +43,9 @@ except ImportError:
     pass
 
 
+INITIALIZER_STATUS = 'uninitialized'
+
+
 def clean_warning_registry():
     """Safe way to reset warnings."""
     warnings.resetwarnings()
@@ -651,3 +654,37 @@ def test_reusable_executor_reuse_true():
 
     executor4 = get_reusable_executor()
     assert executor4 is executor3
+
+
+class TestExecutorInitializer(ReusableExecutorMixin):
+    def _initializer(self, x):
+        global INITIALIZER_STATUS
+        INITIALIZER_STATUS = x
+
+    def _test_initializer(self, delay=0):
+        sleep(delay)
+
+        global INITIALIZER_STATUS
+        return INITIALIZER_STATUS
+
+    def test_reusable_initializer(self):
+        executor = get_reusable_executor(
+            max_workers=2, initializer=self._initializer, initargs=('done',))
+
+        assert executor.submit(self._test_initializer).result() == 'done'
+
+        # when the initializer change, the executor is re-spawned
+        executor = get_reusable_executor(
+            max_workers=2, initializer=self._initializer, initargs=(42,))
+
+        assert executor.submit(self._test_initializer).result() == 42
+
+        # With reuse=True, the executor use the same initializer
+        executor = get_reusable_executor(max_workers=4, reuse=True)
+        for x in executor.map(self._test_initializer, delay=.1):
+            assert x == 42
+
+        # With reuse='auto', the initializer is not used anymore
+        executor = get_reusable_executor(max_workers=4)
+        for x in executor.map(self._test_initializer, delay=.1):
+            assert x == 'uninitialized'

pip install -e .
parse_log_pytest
pytest
pytest pytest-timeout psutil coverage
apt-get update apt-get install -y gcc
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
cloudpickle==2.2.1
coverage==6.2
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
-e git+https://github.com/tomMoral/loky.git@1bf741a4796d15c517902a3331b5bd9e86502037#egg=loky
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
psutil==7.0.0
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
pytest-timeout==2.1.0
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: loky
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - cloudpickle==2.2.1
      - coverage==6.2
      - psutil==7.0.0
      - pytest-timeout==2.1.0
prefix: /opt/conda/envs/loky

tests/test_reusable_executor.py::TestExecutorInitializer::test_reusable_initializer
tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[id-args0-SystemExit] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[id-args1-PicklingError] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[id-args2-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[id-args3-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[id-args4-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[id-args5-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[crash-args6-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[exit-args7-SystemExit] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[c_exit-args8-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[raise_error-args9-RuntimeError] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[return_instance-args10-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[return_instance-args11-SystemExit] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[return_instance-args12-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[return_instance-args13-PicklingError] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[return_instance-args14-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crashes[return_instance-args15-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[id-args0-SystemExit] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[id-args1-PicklingError] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[id-args2-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[id-args3-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[id-args4-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[id-args5-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[crash-args6-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[exit-args7-SystemExit] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[c_exit-args8-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[raise_error-args9-RuntimeError] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[return_instance-args10-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[return_instance-args11-SystemExit] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[return_instance-args12-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[return_instance-args13-PicklingError] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[return_instance-args14-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_in_callback_submit_with_crash[return_instance-args15-BrokenProcessPool] tests/test_reusable_executor.py::TestExecutorDeadLock::test_callback_crash_on_submit tests/test_reusable_executor.py::TestExecutorDeadLock::test_deadlock_kill tests/test_reusable_executor.py::TestExecutorDeadLock::test_crash_races[1] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crash_races[2] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crash_races[5] tests/test_reusable_executor.py::TestExecutorDeadLock::test_crash_races[13] tests/test_reusable_executor.py::TestExecutorDeadLock::test_imap_handle_iterable_exception tests/test_reusable_executor.py::TestExecutorDeadLock::test_queue_full_deadlock tests/test_reusable_executor.py::TestTerminateExecutor::test_shutdown_kill tests/test_reusable_executor.py::TestTerminateExecutor::test_shutdown_deadlock tests/test_reusable_executor.py::TestTerminateExecutor::test_kill_workers_on_new_options tests/test_reusable_executor.py::TestResizeExecutor::test_reusable_executor_resize tests/test_reusable_executor.py::TestResizeExecutor::test_reusable_executor_resize_many_times[True-True] tests/test_reusable_executor.py::TestResizeExecutor::test_reusable_executor_resize_many_times[True-False] tests/test_reusable_executor.py::TestResizeExecutor::test_reusable_executor_resize_many_times[False-True] tests/test_reusable_executor.py::TestResizeExecutor::test_reusable_executor_resize_many_times[False-False] tests/test_reusable_executor.py::TestResizeExecutor::test_kill_after_resize_call tests/test_reusable_executor.py::TestResizeExecutor::test_resize_after_timeout tests/test_reusable_executor.py::test_invalid_process_number tests/test_reusable_executor.py::test_invalid_context tests/test_reusable_executor.py::test_call_item_gc_crash_or_exit tests/test_reusable_executor.py::test_pass_start_method_name_as_context tests/test_reusable_executor.py::test_interactively_define_executor_no_main tests/test_reusable_executor.py::test_compat_with_concurrent_futures_exception tests/test_reusable_executor.py::test_reusable_executor_thread_safety[constant-clean_start] tests/test_reusable_executor.py::test_reusable_executor_thread_safety[constant-broken_start] tests/test_reusable_executor.py::test_reusable_executor_thread_safety[varying-clean_start] tests/test_reusable_executor.py::test_reusable_executor_thread_safety[varying-broken_start] tests/test_reusable_executor.py::test_reusable_executor_reuse_true
examples/reuseable_executor.py CHANGES.md examples/deadlock_results.py loky/reusable_executor.py examples/deadlock_timeout_shutdown.py
examples/reuseable_executor.py CHANGES.md examples/deadlocks/deadlock_results.py loky/reusable_executor.py examples/deadlocks/deadlock_timeout_shutdown.py