У меня возникла проблема в том, что я хотел завершить многопроцессорный подпроцесс, если потребовалось больше времени, чем заданная длина таймаута. Я хотел установить тайм-аут в Popen()
, но это не сработало. Затем я понял, что Popen().wait()
равен call()
, и поэтому у меня возникла идея установить тайм-аут в рамках метода .wait(timeout=xxx)
, который, наконец, работал. Таким образом, я решил это так:
import os
import sys
import signal
import subprocess
from multiprocessing import Pool
cores_for_parallelization = 4
timeout_time = 15 # seconds
def main():
jobs = [...YOUR_JOB_LIST...]
with Pool(cores_for_parallelization) as p:
p.map(run_parallel_jobs, jobs)
def run_parallel_jobs(args):
# Define the arguments including the paths
initial_terminal_command = 'C:\\Python34\\python.exe' # Python executable
function_to_start = 'C:\\temp\\xyz.py' # The multithreading script
final_list = [initial_terminal_command, function_to_start]
final_list.extend(args)
# Start the subprocess and determine the process PID
subp = subprocess.Popen(final_list) # starts the process
pid = subp.pid
# Wait until the return code returns from the function by considering the timeout.
# If not, terminate the process.
try:
returncode = subp.wait(timeout=timeout_time) # should be zero if accomplished
except subprocess.TimeoutExpired:
# Distinguish between Linux and Windows and terminate the process if
# the timeout has been expired
if sys.platform == 'linux2':
os.kill(pid, signal.SIGTERM)
elif sys.platform == 'win32':
subp.terminate()
if __name__ == '__main__':
main()
Преимущества предложения L2S:
Относительно производительности:
Относительно отлаживания:
Относительно другого слоя:
Всего несколько быстрых мыслей.
LINQ в общем
LINQ к SQL (или другая база данных LINQ)
Это не панацея каким-либо образом, но я значительно предпочитаю, чтобы это или к делающий SQL-запросы непосредственно или к использующий сохранило procs.
Я должен сказать, что они - то, что Вы искали. Это занимает время, привыкая к нему, но как только Вы делаете Вы не можете думать о возвращении (по крайней мере, для меня). Относительно linq по сравнению с хранимыми процедурами у Вас может быть низкая производительность на также при создании его неправильно. Я переместил в linq к sql некоторые хранимые процедуры клиента, которые были ужасно кодированы, таким образом, время, отброшенное от 20secs (полностью недопустимый для веб-приложения) к < 1 секунда. И очень намного меньше кода тогда решение для хранимой процедуры.
Обновление 1: Также Вы получаете большую гибкость, поскольку можно ограничить столбцы того, что Вы получаете, и она на самом деле только получит это. На решении для хранимой процедуры необходимо определить процедуру каждого столбца, устанавливает Вас, добираются, даже если базовые запросы являются тем же.
Мы недавно переключились на LINQ2Entity по среде Платформы Объекта. Прежде, у нас был основной SQLadapters. Так как база данных, с которой мы работаем, является довольно маленькой, я не могу прокомментировать производительность LINQ.
я должен признать, хотя, запросы записи стали намного легче, и добавление Объектов, действительно включает строгий контроль типов.