Моя среда разработки - это Windows-машина с рубином 1.9.3p125 (RubyInstaller) и рельсы 3.2.8.
Одной из проблем, возникающих снова и снова при использовании сторонних драгоценных камней, является отсутствие fork() в Windows. Это в последнее время затрудняло мою способность использовать практически любой распределенный тестовый запуск gem (например, эти) из-за их зависимости от fork.
Некоторые старые вопросы в StackOverflow пытались найти решение этой проблемы, но были либо до добавления Process.spawn в ruby, либо из людей, вынужденных использовать более раннюю версию Ruby, по какой-то другой причине.
Одним из предлагаемых решений является использование Cygwin для получения поддержки fork(), что просто не может быть и речи - я думаю, что раньше я предпочел бы перейти на Linux.
В другом предлагаемом решении используется win32-process gem, чтобы получить поддержку fork(). Поддержка вилки была удалена из последней версии (0.7.0) и с использованием следующей самой старой версии (0.6.6), которая делает (видовую) поддержку fork, похоже, не работает, по крайней мере для запуска любого из распределенных тестируя драгоценные камни, которые я пробовал (Spork, Parallel tests, Hydra, Specjour, практически все из них). Интересно, что автор драгоценного камня ссылается, в readme, на Process.spawn, являющийся приемлемым обходным решением для Process.fork.
Я видел много информации, либо подразумевая, либо заявляя откровенно, что икру может использоваться в качестве замены fork в Windows с Ruby 1.9. Я потратил немало времени, играя с этим, в основном пытаясь заменить Process.fork на Process.spawn в некоторых из упомянутых драгоценных камней, без успеха. Мне кажется, что поведение похоже, но не совсем то же самое. Например, неясно, копирует ли вскрытие весь процесс так же, как это делает вилка, или просто создает новый процесс с предоставленными аргументами. Также неясно, допускает ли метод порождения другой метод ruby в качестве аргумента или только системная команда. Документы, по-видимому, подразумевают, что это всего лишь команда, но метод работает (сортировка), но я могу делать что-то неправильно. Я думаю, что для некоторых вещей вилка использовалась только для создания "дешевой нити", в предыдущих версиях рубинов, которые не поддерживали потоки. Тем не менее, похоже, что эти распределенные тестовые камни могут законным образом полагаться на полную функциональность fork(), чтобы поддерживать состояние проекта и не загружать всю среду ruby для каждого теста. Это немного отличается от моих обычных обязанностей и опыта программирования, поэтому я могу сделать некоторые неправильные предположения.
Итак, мой вопрос в том, может ли Process.spawn использоваться относительно просто для достижения того же результата, что и Process.fork, во всех случаях? Я начинаю подозревать, что нет, но если да, может кто-нибудь, пожалуйста, отправьте пример того, как можно было бы сделать преобразование?