Я просто искал то же самое и нашел это:
http://blogs.gnome.org/johan/2007/01/18/introducing-python-launcher/
Python-launcher не решает проблему напрямую, но указывает на интересное направление: если вы создаете небольшого демона, с которым вы можете связаться через оболочку для форка нового экземпляра, вы можете избавиться от своего запуска время.
Например, получите python-launcher и socat¹ и сделайте следующее:
PYTHONPATH="../lib.linux-x86_64-2.7/" python python-launcher-daemon &
echo pass > 1
for i in {1..100}; do
echo 1 | socat STDIN UNIX-CONNECT:/tmp/python-launcher-daemon.socket &
done
Todo: Адаптируйте его к своей программе, удалите GTK. Обратите внимание на & в конце: закрытие сокета кажется медленным.
Важный трюк - просто создать сервер, который открывает сокет. Затем он читает все данные из сокета. Получив данные, он разветвляется следующим образом:
pid = os.fork()
if pid:
return
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
signal.signal(signal.SIGCHLD, signal.SIG_DFL)
glob = dict(__name__="__main__")
print 'launching', program
execfile(program, glob, glob)
raise SystemExit
Запуск 100 программ таким образом занял у меня всего 0,7 секунды.
Возможно, вам придется переключиться с разветвления на выполнение кода вместо разветвления, если вы хотите быть очень быстрым.
(Это то, что я также делаю с emacsclient… Моему emacs требуется ~ 30 с для запуска (из-за чрезмерного использования дополнительных библиотек, которые я добавил), но emacsclient -c появляется почти мгновенно.)
¹: http://www.socat.org