Panel.serve with num_procs breaks if importing datashade

I was experiencing the same as https://github.com/holoviz/panel/issues/1405 and I found that it only happened when I from holoviews.operation.datashader import datashade. Here’s a minimal example:

#!/usr/bin/env python3.8

import panel
import holoviews

# This line breaks things:
from holoviews.operation.datashader import datashade

print(panel.__version__)
print(holoviews.__version__)

panel.serve(
    panel.pane.Markdown("#1"),
    port=8008,
    show=True,
    num_procs=2
)

0.10.0
1.13.5
Launching server at http://localhost:8008
Traceback (most recent call last):
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 259, in _add_reader
    key = self._selector.get_key(fd)
  File "/usr/lib/python3.8/selectors.py", line 192, in get_key
    raise KeyError("{!r} is not registered".format(fileobj)) from None
KeyError: '6 is not registered'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "../.config/JetBrains/PyCharmCE2020.2/scratches/scratch_1.py", line 12, in <module>
    panel.serve(
  File "/home/rick/panel/panel/io/server.py", line 208, in serve
    server = get_server(panels, **kwargs)
  File "/home/rick/panel/panel/io/server.py", line 380, in get_server
    server = Server(apps, port=port, **opts)
  File "/home/rick/.local/lib/python3.8/site-packages/bokeh/server/server.py", line 415, in __init__
    http_server.add_sockets(sockets)
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/tcpserver.py", line 165, in add_sockets
    self._handlers[sock.fileno()] = add_accept_handler(
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/netutil.py", line 279, in add_accept_handler
    io_loop.add_handler(sock, accept_handler, IOLoop.READ)
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/platform/asyncio.py", line 100, in add_handler
    self.asyncio_loop.add_reader(fd, self._handle_events, fd, IOLoop.READ)
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 332, in add_reader
    return self._add_reader(fd, callback, *args)
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 261, in _add_reader
    self._selector.register(fd, selectors.EVENT_READ,
  File "/usr/lib/python3.8/selectors.py", line 359, in register
    self._selector.register(key.fd, poller_events)
FileExistsError: [Errno 17] File exists
Traceback (most recent call last):
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 259, in _add_reader
    key = self._selector.get_key(fd)
  File "/usr/lib/python3.8/selectors.py", line 192, in get_key
    raise KeyError("{!r} is not registered".format(fileobj)) from None
KeyError: '6 is not registered'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "../.config/JetBrains/PyCharmCE2020.2/scratches/scratch_1.py", line 12, in <module>
    panel.serve(
  File "/home/rick/panel/panel/io/server.py", line 208, in serve
    server = get_server(panels, **kwargs)
  File "/home/rick/panel/panel/io/server.py", line 380, in get_server
    server = Server(apps, port=port, **opts)
  File "/home/rick/.local/lib/python3.8/site-packages/bokeh/server/server.py", line 415, in __init__
    http_server.add_sockets(sockets)
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/tcpserver.py", line 165, in add_sockets
    self._handlers[sock.fileno()] = add_accept_handler(
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/netutil.py", line 279, in add_accept_handler
    io_loop.add_handler(sock, accept_handler, IOLoop.READ)
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/platform/asyncio.py", line 100, in add_handler
    self.asyncio_loop.add_reader(fd, self._handle_events, fd, IOLoop.READ)
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 332, in add_reader
    return self._add_reader(fd, callback, *args)
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 261, in _add_reader
    self._selector.register(fd, selectors.EVENT_READ,
  File "/usr/lib/python3.8/selectors.py", line 359, in register
    self._selector.register(key.fd, poller_events)
FileExistsError: [Errno 17] File exists
Traceback (most recent call last):
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 259, in _add_reader
    key = self._selector.get_key(fd)
  File "/usr/lib/python3.8/selectors.py", line 192, in get_key
    raise KeyError("{!r} is not registered".format(fileobj)) from None
KeyError: '6 is not registered'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "../.config/JetBrains/PyCharmCE2020.2/scratches/scratch_1.py", line 12, in <module>
    panel.serve(
  File "/home/rick/panel/panel/io/server.py", line 208, in serve
    server = get_server(panels, **kwargs)
  File "/home/rick/panel/panel/io/server.py", line 380, in get_server
    server = Server(apps, port=port, **opts)
  File "/home/rick/.local/lib/python3.8/site-packages/bokeh/server/server.py", line 415, in __init__
    http_server.add_sockets(sockets)
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/tcpserver.py", line 165, in add_sockets
    self._handlers[sock.fileno()] = add_accept_handler(
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/netutil.py", line 279, in add_accept_handler
    io_loop.add_handler(sock, accept_handler, IOLoop.READ)
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/platform/asyncio.py", line 100, in add_handler
    self.asyncio_loop.add_reader(fd, self._handle_events, fd, IOLoop.READ)
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 332, in add_reader
    return self._add_reader(fd, callback, *args)
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 261, in _add_reader
    self._selector.register(fd, selectors.EVENT_READ,
  File "/usr/lib/python3.8/selectors.py", line 359, in register
    self._selector.register(key.fd, poller_events)
FileExistsError: [Errno 17] File exists
^XTraceback (most recent call last):
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 259, in _add_reader
    key = self._selector.get_key(fd)
  File "/usr/lib/python3.8/selectors.py", line 192, in get_key
    raise KeyError("{!r} is not registered".format(fileobj)) from None
KeyError: '6 is not registered'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "../.config/JetBrains/PyCharmCE2020.2/scratches/scratch_1.py", line 12, in <module>
    panel.serve(
  File "/home/rick/panel/panel/io/server.py", line 208, in serve
    server = get_server(panels, **kwargs)
  File "/home/rick/panel/panel/io/server.py", line 380, in get_server
    server = Server(apps, port=port, **opts)
  File "/home/rick/.local/lib/python3.8/site-packages/bokeh/server/server.py", line 415, in __init__
    http_server.add_sockets(sockets)
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/tcpserver.py", line 165, in add_sockets
    self._handlers[sock.fileno()] = add_accept_handler(
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/netutil.py", line 279, in add_accept_handler
    io_loop.add_handler(sock, accept_handler, IOLoop.READ)
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/platform/asyncio.py", line 100, in add_handler
    self.asyncio_loop.add_reader(fd, self._handle_events, fd, IOLoop.READ)
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 332, in add_reader
    return self._add_reader(fd, callback, *args)
  File "/usr/lib/python3.8/asyncio/selector_events.py", line 261, in _add_reader
    self._selector.register(fd, selectors.EVENT_READ,
  File "/usr/lib/python3.8/selectors.py", line 359, in register
    self._selector.register(key.fd, poller_events)
FileExistsError: [Errno 17] File exists
^CTraceback (most recent call last):
  File "../.config/JetBrains/PyCharmCE2020.2/scratches/scratch_1.py", line 12, in <module>
    panel.serve(
  File "/home/rick/panel/panel/io/server.py", line 208, in serve
    server = get_server(panels, **kwargs)
  File "/home/rick/panel/panel/io/server.py", line 380, in get_server
    server = Server(apps, port=port, **opts)
  File "/home/rick/.local/lib/python3.8/site-packages/bokeh/server/server.py", line 414, in __init__
    http_server.start(opts.num_procs)
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/tcpserver.py", line 241, in start
    process.fork_processes(num_processes, max_restarts)
  File "/home/rick/.local/lib/python3.8/site-packages/tornado/process.py", line 148, in fork_processes
    pid, status = os.wait()

Try python 3.7 don’t think datashader supports above. No idea about the error, don’t know if holoviews datashade component is different from datashder itself but worth a go.

Interesting observation! I can’t think of why that would be, offhand. In any case, please report clear bugs like this on Github, which is where we manage bug fixes and collecting issues for releases. In this case it would be https://github.com/holoviz/panel/issues .