Почему бы не загрузить CSV в кадр данных pandas, используя https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html ? Это значительно облегчит получение названия столбца.
Я собираюсь сделать предположение, что, поскольку вы пишете условно-бесплатное ПО и упоминаете алгоритм регистрации, вы хотите защитить свое программное обеспечение от генерации ключей или патча, который обходит ограничения на ваши пробные версии
На самом деле все, что вы можете сделать, - это сдерживать. Как уже упоминалось, существуют методы запутывания, но они не являются профилактическими. Существуют коммерческие программные упаковщики, которые сжимают файл и делают его изначально нечитаемым. Но в какой-то момент программа должна быть распакована, чтобы машина могла ее запустить, чтобы она оставалась обратимой.
И это в значительной степени костыль против любой из техник антиреверсии, которые вы увидите. В какой-то момент это должно быть интерпретировано машиной. Более современные упаковщики используют методы борьбы с отладкой, чтобы отпугнуть новичков. Но эти методы довольно быстро документируются на популярных сайтах реверсирования. Многие методы обходятся не более чем с помощью простого плагина отладчика.
Единственный способ, который я могу придумать, чтобы защитить ваш исполняемый файл от произвольного обращения, - это запустить все это на сервере, которым вы управляете, и просто направить вывод на пользователей. Но это не всегда возможно.
Что касается языковых параметров, возьмите добычу в здесь . Я не могу сказать, насколько он полон, но уверен, что некоторые другие могут добавить языки, о которых они думают.
Единственный способ, который я могу придумать, чтобы защитить ваш исполняемый файл от произвольного обращения, - это запустить все это на сервере, который вы контролируете, и просто направить вывод пользователям. Но это не всегда возможно.
Что касается языковых параметров, возьмите добычу в здесь . Я не могу точно сказать, насколько он полон, но уверен, что некоторые другие могут добавить языки, которые они думают.
Единственный способ, который я могу придумать, чтобы защитить ваш исполняемый файл от произвольного обращения, - это запустить все это на сервере, которым вы управляете, и просто перенаправить вывод пользователям. Но это не всегда возможно.
Что касается языковых параметров, возьмите добычу в здесь . Я не могу сказать, насколько он полон, но уверен, что некоторые другие могут добавить языки, о которых они думают.
предпочтительной очередью является 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 является исключением из приведенного выше правила. Спасибо Стиву за , который обратил мое внимание на .Это работает на 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
В вашем первом примере последующие задачи отклоняются, поскольку AbortPolicy
является значением по умолчанию RejectedExecutionHandler
. ThreadPoolExecutor содержит следующие политики, которые можно изменить с помощью метода setRejectedExecutionHandler
:
CallerRunsPolicy
AbortPolicy
DiscardPolicy
DiscardOldestPolicy
Похоже, вам нужен кешированный пул потоков с CallerRunsPolicy.
Согласно документации Javadoc для ThreadPoolExecutor:
Если количество запущенных потоков больше corePoolSize, но меньше maximumPoolSize, новый поток будет создан , только если очередь заполнена . Устанавливая одинаковые значения corePoolSize и maximumPoolSize, вы создаете пул потоков фиксированного размера.
(выделено мной)
jitter - это то, что вы хотите, хотя я отвечаю на ваш другой вопрос. :)
Это то, что вам нужно (по крайней мере, я так думаю). Для проверки объяснения Ответ Джонатана Фейнберга
Executors.newFixedThreadPool (int n)
Создает пул потоков, который повторно использует фиксированное количество потоков, работающих в общей неограниченной очереди. В любой момент не более nThreads потоков будут активными задачами обработки. Если дополнительные задачи отправляются, когда все потоки активны, они будут ждать в очереди, пока поток не станет доступным. Если какой-либо поток завершается из-за сбоя во время выполнения до завершения работы, его место займет новый, если это необходимо для выполнения последующих задач. Потоки в пуле будут существовать до тех пор, пока он не будет явно отключен.