각 실행을 평가하기 위해 다중 처리 풀을 사용하여 콘솔 기반 게임의 다중 인스턴스 (연구 목적으로 자연스럽게 던전 크롤링 수프)를 실행하려고합니다.Python 하위 프로세스로 대화 형 셸 처리
이전에 비슷한 코드 (유전 알고리즘)를 평가하기 위해 풀을 사용한 적이 있는데, 각 프로세스를 분리하기 위해 subprocess.call
을 사용했습니다. 그러나 dcss가 상당히 상호 작용하여 공유 서브 쉘을 갖는 것이 문제가되는 것 같습니다.
저는 일반적으로 이런 종류의 작업에 사용하는 코드가 있습니다. 크롤링은 GA를 던진 다른 애플리케이션을 대체합니다. 이보다 더 높은 대화식 셸을 처리하는 더 좋은 방법이 있습니까? 나는 각 인스턴스에 대한 화면을 시작하는 것으로 생각했지만 깨끗한 방법이 있다고 생각했습니다. 내 이해는 shell=True
하위 껍질을 산란되어야하지만 그것은 각 호출간에 공유되는 방식으로 하나 산란 것 같아요.
나는 게임을 실행하는 봇을 언급해야한다. 그래서 사용자의 실제적인 상호 작용이 발생하기를 원하지 않는다.
# Kick off the GA execution
pool_args = zip(trial_ids,run_types,self.__population)
pool.map(self._GAExecute, pool_args)
---
# called by pool.map
def _GAExecute(self,pool_args):
trial_id = pool_args[0]
run_type = pool_args[1]
genome = pool_args[2]
self._RunSimulation(trial_id)
# Call the actual binary
def _RunSimulation(self, trial_id):
command = "./%s" % self.__crawl_binary
name = "-name %s" % trial_id
rc = "-rc %s" % os.path.join(self.__output_dir,'qw-%s'%trial_id,"qw -%s.rc"%trial_id)
seed = "-seed %d" % self.__seed
cdir = "-dir %s" % os.path.join(self.__output_dir,'qw-%s'%trial_id)
shell_command = "%s %s %s %s %s" % (command,name,rc,seed,cdir)
call(shell_command, shell=True)
그건 도움이 되겠지만, 나는 스레드 풀이 차단되어야한다고 확신합니다. GA에서 실행되므로 제어 루프의 다음 반복이 호출되기 전에 모든 구성원의 평가가 완료되어야합니다. – espais
for 루프의'poll()'덕분에/차단 될 수 있습니다. 이 솔루션의 관심사는 실제로 하위 프로세스 실행을 시작하기 위해 스레드/스레드 풀을 직접 관리 할 필요가 없다는 것입니다. – Guillaume