Невозможный сделать кэшируемый пул потоков с пределом размера?

Почему бы не загрузить CSV в кадр данных pandas, используя https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html ? Это значительно облегчит получение названия столбца.

118
задан Ravindra babu 2 March 2016 в 13:33
поделиться

5 ответов

Я собираюсь сделать предположение, что, поскольку вы пишете условно-бесплатное ПО и упоминаете алгоритм регистрации, вы хотите защитить свое программное обеспечение от генерации ключей или патча, который обходит ограничения на ваши пробные версии

На самом деле все, что вы можете сделать, - это сдерживать. Как уже упоминалось, существуют методы запутывания, но они не являются профилактическими. Существуют коммерческие программные упаковщики, которые сжимают файл и делают его изначально нечитаемым. Но в какой-то момент программа должна быть распакована, чтобы машина могла ее запустить, чтобы она оставалась обратимой.

И это в значительной степени костыль против любой из техник антиреверсии, которые вы увидите. В какой-то момент это должно быть интерпретировано машиной. Более современные упаковщики используют методы борьбы с отладкой, чтобы отпугнуть новичков. Но эти методы довольно быстро документируются на популярных сайтах реверсирования. Многие методы обходятся не более чем с помощью простого плагина отладчика.

Единственный способ, который я могу придумать, чтобы защитить ваш исполняемый файл от произвольного обращения, - это запустить все это на сервере, которым вы управляете, и просто направить вывод на пользователей. Но это не всегда возможно.

Что касается языковых параметров, возьмите добычу в здесь . Я не могу сказать, насколько он полон, но уверен, что некоторые другие могут добавить языки, о которых они думают.

Единственный способ, который я могу придумать, чтобы защитить ваш исполняемый файл от произвольного обращения, - это запустить все это на сервере, который вы контролируете, и просто направить вывод пользователям. Но это не всегда возможно.

Что касается языковых параметров, возьмите добычу в здесь . Я не могу точно сказать, насколько он полон, но уверен, что некоторые другие могут добавить языки, которые они думают.

Единственный способ, который я могу придумать, чтобы защитить ваш исполняемый файл от произвольного обращения, - это запустить все это на сервере, которым вы управляете, и просто перенаправить вывод пользователям. Но это не всегда возможно.

Что касается языковых параметров, возьмите добычу в здесь . Я не могу сказать, насколько он полон, но уверен, что некоторые другие могут добавить языки, о которых они думают.

предпочтительной очередью является LinkedBlockingQueue неограниченного размера. Следовательно, вы застряли с поведением № 2.

Вы не можете много повозиться с кэшированным типом или фиксированным типом, поскольку их поведение почти полностью определено.

Если вы хотите иметь ограниченный и динамический пул потоков, вам необходимо использовать положительный размер ядра и максимальный размер в сочетании с очередью конечного размера. Например,

new ThreadPoolExecutor(10, // core size
    50, // max size
    10*60, // idle timeout
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<Runnable>(20)); // queue with a size

Addendum : это довольно старый ответ, и похоже, что JDK изменил свое поведение, когда дело доходит до размера ядра 0. Начиная с JDK 1.6, если размер ядра равен 0, а пул не есть потоки, ThreadPoolExecutor добавит поток для выполнения этой задачи. Следовательно, размер ядра 0 является исключением из приведенного выше правила. Спасибо Стиву за , который обратил мое внимание на .

Следовательно, вы застряли с поведением № 2.

Вы не можете много повозиться с кэшированным типом или фиксированным типом, поскольку их поведение почти полностью определено.

Если вы хотите иметь ограниченный и динамический пул потоков, вам необходимо использовать положительный размер ядра и максимальный размер в сочетании с очередью конечного размера. Например,

new ThreadPoolExecutor(10, // core size
    50, // max size
    10*60, // idle timeout
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<Runnable>(20)); // queue with a size

Addendum : это довольно старый ответ, и похоже, что JDK изменил свое поведение, когда дело доходит до размера ядра 0. Начиная с JDK 1.6, если размер ядра равен 0, а пул не есть какие-либо потоки, ThreadPoolExecutor добавит поток для выполнения этой задачи. Следовательно, размер ядра 0 является исключением из приведенного выше правила. Спасибо Стиву за , который обратил мое внимание на .

Следовательно, вы застряли с поведением № 2.

Вы не можете особо повозиться с кэшированным типом или фиксированным типом, поскольку их поведение почти полностью определено.

Если вы хотите иметь ограниченный и динамический пул потоков, вам необходимо использовать положительный размер ядра и максимальный размер в сочетании с очередью конечного размера. Например,

new ThreadPoolExecutor(10, // core size
    50, // max size
    10*60, // idle timeout
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<Runnable>(20)); // queue with a size

Дополнение : это довольно старый ответ, и похоже, что JDK изменил свое поведение, когда дело доходит до размера ядра 0. Начиная с JDK 1.6, если размер ядра равен 0, а пул не есть потоки, ThreadPoolExecutor добавит поток для выполнения этой задачи. Следовательно, размер ядра 0 является исключением из приведенного выше правила. Спасибо Стиву за , который обратил мое внимание на .

Вы не можете много повозиться с кэшированным типом или фиксированным типом, поскольку их поведение почти полностью определено.

Если вы хотите иметь ограниченный и динамический пул потоков, вам нужно использовать положительный размер ядра и максимальное size в сочетании с очередью конечного размера. Например,

new ThreadPoolExecutor(10, // core size
    50, // max size
    10*60, // idle timeout
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<Runnable>(20)); // queue with a size

Дополнение : это довольно старый ответ, и похоже, что JDK изменил свое поведение, когда дело доходит до размера ядра 0. Начиная с JDK 1.6, если размер ядра равен 0, а пул не есть потоки, ThreadPoolExecutor добавит поток для выполнения этой задачи. Следовательно, размер ядра 0 является исключением из приведенного выше правила. Спасибо Стиву за , который обратил мое внимание на .

Вы не можете сильно повозиться с кэшированным типом или фиксированным типом, поскольку их поведение почти полностью определено.

Если вы хотите иметь ограниченный и динамический пул потоков, вам нужно использовать положительный размер ядра и максимальное size в сочетании с очередью конечного размера. Например,

new ThreadPoolExecutor(10, // core size
    50, // max size
    10*60, // idle timeout
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<Runnable>(20)); // queue with a size

Дополнение : это довольно старый ответ, и похоже, что JDK изменил свое поведение, когда дело доходит до размера ядра 0. Начиная с JDK 1.6, если размер ядра равен 0, а пул не есть потоки, ThreadPoolExecutor добавит поток для выполнения этой задачи. Следовательно, размер ядра 0 является исключением из приведенного выше правила. Спасибо Стиву за , который обратил мое внимание на .

вам необходимо использовать положительный размер ядра и максимальный размер в сочетании с очередью конечного размера. Например,

new ThreadPoolExecutor(10, // core size
    50, // max size
    10*60, // idle timeout
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<Runnable>(20)); // queue with a size

Дополнение : это довольно старый ответ, и похоже, что JDK изменил свое поведение, когда дело доходит до размера ядра 0. Начиная с JDK 1.6, если размер ядра равен 0, а пул не есть какие-либо потоки, ThreadPoolExecutor добавит поток для выполнения этой задачи. Следовательно, размер ядра 0 является исключением из приведенного выше правила. Спасибо Стиву за , который обратил мое внимание на .

вам необходимо использовать положительный размер ядра и максимальный размер в сочетании с очередью конечного размера. Например,

new ThreadPoolExecutor(10, // core size
    50, // max size
    10*60, // idle timeout
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<Runnable>(20)); // queue with a size

Дополнение : это довольно старый ответ, и похоже, что JDK изменил свое поведение, когда дело доходит до размера ядра 0. Начиная с JDK 1.6, если размер ядра равен 0, а пул не есть потоки, ThreadPoolExecutor добавит поток для выполнения этой задачи. Следовательно, размер ядра 0 является исключением из приведенного выше правила. Спасибо Стиву за , который обратил мое внимание на .

ThreadPoolExecutor добавит поток для выполнения этой задачи. Следовательно, размер ядра 0 является исключением из приведенного выше правила. Спасибо Стиву за , который обратил мое внимание на .

ThreadPoolExecutor добавит поток для выполнения этой задачи. Следовательно, размер ядра 0 является исключением из приведенного выше правила. Спасибо Стиву за , который обратил мое внимание на .

225
ответ дан 24 November 2019 в 01:55
поделиться

Это работает на Java8 + (и другой, на данный момент..)

     Executor executor = new ThreadPoolExecutor(3, 3, 5, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>()){{allowCoreThreadTimeOut(true);}};

то, где 3 предел количества потоков, и 5, является тайм-аутом для неактивных потоков.

, Если Вы хотите к проверка, если она работает сами , вот код, чтобы сделать задание:

public static void main(String[] args) throws InterruptedException {
    final int DESIRED_NUMBER_OF_THREADS=3; // limit of number of Threads for the task at a time
    final int DESIRED_THREAD_IDLE_DEATH_TIMEOUT=5; //any idle Thread ends if it remains idle for X seconds

    System.out.println( java.lang.Thread.activeCount() + " threads");
    Executor executor = new ThreadPoolExecutor(DESIRED_NUMBER_OF_THREADS, DESIRED_NUMBER_OF_THREADS, DESIRED_THREAD_IDLE_DEATH_TIMEOUT, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>()) {{allowCoreThreadTimeOut(true);}};

    System.out.println(java.lang.Thread.activeCount() + " threads");

    for (int i = 0; i < 5; i++) {
        final int fi = i;
        executor.execute(() -> waitsout("starting hard thread computation " + fi, "hard thread computation done " + fi,2000));
    }
    System.out.println("If this is UP, it works");

    while (true) {
        System.out.println(
                java.lang.Thread.activeCount() + " threads");
        Thread.sleep(700);
    }

}

static void waitsout(String pre, String post, int timeout) {
    try {
        System.out.println(pre);
        Thread.sleep(timeout);
        System.out.println(post);
    } catch (Exception e) {
    }
}

вывод кода выше для меня

1 threads
1 threads
If this is UP, it works
starting hard thread computation 0
4 threads
starting hard thread computation 2
starting hard thread computation 1
4 threads
4 threads
hard thread computation done 2
hard thread computation done 0
hard thread computation done 1
starting hard thread computation 3
starting hard thread computation 4
4 threads
4 threads
4 threads
hard thread computation done 3
hard thread computation done 4
4 threads
4 threads
4 threads
4 threads
3 threads
3 threads
3 threads
1 threads
1 threads
0
ответ дан 24 November 2019 в 01:55
поделиться

В вашем первом примере последующие задачи отклоняются, поскольку AbortPolicy является значением по умолчанию RejectedExecutionHandler . ThreadPoolExecutor содержит следующие политики, которые можно изменить с помощью метода setRejectedExecutionHandler :

CallerRunsPolicy
AbortPolicy
DiscardPolicy
DiscardOldestPolicy

Похоже, вам нужен кешированный пул потоков с CallerRunsPolicy.

6
ответ дан 24 November 2019 в 01:55
поделиться

Согласно документации Javadoc для ThreadPoolExecutor:

Если количество запущенных потоков больше corePoolSize, но меньше maximumPoolSize, новый поток будет создан , только если очередь заполнена . Устанавливая одинаковые значения corePoolSize и maximumPoolSize, вы создаете пул потоков фиксированного размера.

(выделено мной)

jitter - это то, что вы хотите, хотя я отвечаю на ваш другой вопрос. :)

3
ответ дан 24 November 2019 в 01:55
поделиться

Это то, что вам нужно (по крайней мере, я так думаю). Для проверки объяснения Ответ Джонатана Фейнберга

Executors.newFixedThreadPool (int n)

Создает пул потоков, который повторно использует фиксированное количество потоков, работающих в общей неограниченной очереди. В любой момент не более nThreads потоков будут активными задачами обработки. Если дополнительные задачи отправляются, когда все потоки активны, они будут ждать в очереди, пока поток не станет доступным. Если какой-либо поток завершается из-за сбоя во время выполнения до завершения работы, его место займет новый, если это необходимо для выполнения последующих задач. Потоки в пуле будут существовать до тех пор, пока он не будет явно отключен.

2
ответ дан 24 November 2019 в 01:55
поделиться