Вопросы по тегу: multithreading

(27)

В чем разница между .Wait() и .GetAwaiter().GetResult()?

Мой метод возвращает Задание. Я хочу подождать, пока он не закончится. Что я должен использовать .Wait() или .GetAwaiter().GetResult()? В чем между ними разница?
u

user6011767

6 лет назад

Ответов: 1

Пример многопроцессорности, дающий AttributeError

Я пытаюсь реализовать многопроцессорность в своем коде, поэтому я подумал, что начну свое обучение с нескольких примеров. Я использовал первый пример из этой документации.from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': with Pool(5) as p: print(p.map(f, [1, 2, 3])) Когда я запускаю приведенный выше код, я получаю AttributeError: невозможно получить атрибут 'f' в . Я не знаю, почему я получаю эту ошибку. Я также использую Python 3.5, если это помогает.
P

PiccolMan

5 лет назад

Ответов: 4

Многопроцессорность вызывает сбой Python и выдает ошибку, возможно, выполнялась в другом потоке при вызове fork ()

Я относительно новичок в Python и пытаюсь реализовать модуль многопроцессорности для своего цикла for.У меня есть массив URL-адресов изображений, хранящихся в img_urls, который мне нужно загрузить и применить какое-то видение Google.if __name__ == '__main__': img_urls = [ALL_MY_Image_URLS] runAll(img_urls) print("--- %s seconds ---" % (time.time() - start_time)) Это мой метод runAll ()def runAll(img_urls): num_cores = multiprocessing.cpu_count() print("Image URLS {}",len(img_urls)) if len(img_urls) > 2: numberOfImages = 0 else: numberOfImages = 1 start_timeProcess = time.time() pool = multiprocessing.Pool() pool.map(annotate,img_urls) end_timeProcess = time.time() print('\n Time to complete ', end_timeProcess-start_timeProcess) print(full_matching_pages) def annotate(img_path): file = requests.get(img_path).content print("file is",file) """Returns web annotations given the path to an image.""" print('Process Working under ',os.getpid()) image = types.Image(content=file) web_detection = vision_client.web_detection(image=image).web_detection report(web_detection) Я получаю это как предупреждение, когда запускаю его, и python вылетаетobjc[67570]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. objc[67570]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug. objc[67567]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. objc[67567]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug. objc[67568]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. objc[67568]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug. objc[67569]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. objc[67569]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug. objc[67571]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. objc[67571]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug. objc[67572]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. objc[67572]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
S

SriTeja Chilakamarri

4 года назад

Ответов: 4

Разница между DispatchQueue.main.async и DispatchQueue.main.sync

Я давно использую DispatchQueue.main.async для выполнения операций, связанных с пользовательским интерфейсом.Swift предоставляет как DispatchQueue.main.async, так и DispatchQueue.main.sync, и оба они выполняются в основной очереди.Может кто подскажет разницу между ними? Когда я должен использовать каждый?DispatchQueue.main.async { self.imageView.image = imageView self.lbltitle.text = "" } DispatchQueue.main.sync { self.imageView.image = imageView self.lbltitle.text = "" }
A

Aman.Samghani

5 лет назад

Ответов: 4

Как проверить текущую ветку в Swift 3?

Как мне проверить, какой поток является текущим в Swift 3?В предыдущих версиях Swift можно было проверить, является ли текущий поток основным, выполнив следующие действия: NSThread.isMainThread()
B

BalestraPatrick

5 лет назад

Ответов: 7

Может ли num ++ быть атомарным для int num?

Как правило, для int num, num ++ (или ++ num) в качестве операции чтения-изменения-записи не атомный. Но я часто вижу компиляторы, например GCC, генерирующие для него следующий код (попробуйте здесь):void f () { int num = 0; число ++; } f(): push rbp mov rbp, rsp mov DWORD PTR [rbp-4], 0 add DWORD PTR [rbp-4], 1 nop pop rbp ret Поскольку строка 5, которая соответствует num ++, является одной инструкцией, можем ли мы сделать вывод, что num ++ является атомарным в этом случае?И если да, то означает ли это, что сгенерированный таким образом num ++ может использоваться в параллельных (многопоточных) сценариях без какой-либо опасности гонок данных (т. Е. Мы не нужно сделать это, например, std :: atomic и наложить соответствующие затраты, так как это все равно атомарно)?ОБНОВЛЕНИЕОбратите внимание, что это , а не, является ли инкремент атомарным (это не так, и это было и является первой строкой вопроса). Это может ли быть в определенных сценариях, то есть может ли природа с одной инструкцией в определенных случаях использоваться, чтобы избежать накладных расходов на префикс lock. И, как упоминается в принятом ответе в разделе, посвященном однопроцессорным машинам, а также , этот ответ, обсуждение в его комментариях и другие объясняют, он может (хотя и не с C или C ++ ).
L

Lmn

5 лет назад

Ответов: 13

Почему setState в Reactjs Async вместо Sync?

Я только что обнаружил, что в response this.setState () функция в любом компоненте является асинхронной или вызывается после завершения функции, в которой она была вызвана.Теперь я поискал и нашел этот блог (операция мутации состояния setState () может быть синхронной в ReactJS)Здесь он обнаружил, что setState является асинхронным (вызывается, когда стек пуст) или синхронизируется (вызывается сразу после вызова), в зависимости от того, как было инициировано изменение состояния.Эти две вещи сложно переварить В блоге функция setState вызывается внутри функции updateState, но то, что вызвало функцию updateState, не является тем, о чем может знать вызываемая функция . Зачем им делать setState async, поскольку JS - это однопоточный язык, а этот setState не является WebAPI или серверным вызовом, поэтому должен выполняться только в потоке JS. Делают ли они это для того, чтобы повторный рендеринг не останавливал всех прослушивателей событий и прочее, или возникла какая-то другая проблема с дизайном.
A

Anup

6 лет назад

Ответов: 8

std :: lock_guard или std :: scoped_lock?

C ++ 17 представил новый класс блокировки под названием std :: scoped_lock.Судя по документации, он похож на уже существующий класс std :: lock_guard.В чем разница и когда его использовать?
S

Stephan Dollberg

5 лет назад

Ответов: 4

Секундомер и ReadKey не работают должным образом

Я работаю над своим многопоточным взломщиком паролей, только числами. Он должен показывать, сколько времени прошло на поиск пароля. Я использовал Секундомер, чтобы найти его, но в функциях Секундомер не работает. Вот мой код:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; using System.Threading; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { int psw = 14995399; Stopwatch time = new Stopwatch(); Thread Thread1 = new Thread(islem1); Thread Thread2 = new Thread(islem2); Thread Thread3 = new Thread(islem3); Thread Thread4 = new Thread(islem4); time.Start(); Thread1.Start(); Thread2.Start(); Thread3.Start(); Thread4.Start(); Thread.Sleep(1000); time.Stop(); System.Console.WriteLine("Time elapsed: {0}", time.Elapsed); Console.ReadKey(); } static void islem1() { for (int i = 00000000; i
A

Ahmet Özdemir

6 лет назад

Ответов: 3

Изменение порядка атомарных чтений

Я работаю над многопоточным алгоритмом, который читает две общие атомные переменные:std::atomic a(10); std::atomic b(20); void func(int key) { int b_local = b; int a_local = a; /* Some Operations on a & b*/ } Инвариант алгоритма состоит в том, что b следует читать перед чтением a.Вопрос в том, может ли компилятор (например, GCC) переупорядочить инструкции так, чтобы a читалось до b? Этого можно добиться с помощью явных ограждений памяти, но я хочу понять, можно ли переупорядочить две атомные нагрузки.Далее, пройдя семантику Acquire / Release из выступления Херба Саттера (http://herbsutter.com/2013/02/11/atomic-weapons-the-c-memory-model-and-modern-hardware/), я понимаю, что последовательно согласованная система обеспечивает упорядочение между получением (например, загрузкой) и выпуском (например, хранилище) . Как насчет упорядочения между двумя приобретениями (например, двумя грузами)?Изменить: Добавление дополнительной информации о коде: Рассмотрим выполнение двух потоков T1 и T2:T1: считывает значение b, засыпаетT2: изменяет значение a, возвращаетT1: просыпается и считывает новое значение a(новое значение)Теперь рассмотрим этот сценарий с повторным заказом:int a_local = a; int b_local = b;T1: считывает значение a, засыпаетT2: изменяет значение a, возвращаетT1: ничего не знает об изменении значения a.Вопрос: «Может ли компилятор, такой как GCC, переупорядочить две атомные загрузки»
V

Varun V

6 лет назад

Ответов: 4

Синхронизированный объект: код блокировки против объекта блокировки

Предположим, у вас есть два потока, которые имеют доступ к одному и тому же общедоступному объекту. У одного потока есть блок кода, который читает поля объекта.synchronized(object) { read object fields } Пока код поля считываемого объекта выполняется в потоке 1, если поток 2 хочет обновить поля объекта, ему придется ждать, пока поток 1 закончит чтение полей объекта перед обновлением (например, объект заблокирован от доступа других потоков во время выполнения синхронизированного блока кода)?
G

G Vaid

6 лет назад

Ответов: 3

Минимальный пример использования потоков Qt?

TL; DR:Я искал краткий пример потоковой передачи Qt, и все, что я нашел, было сложной "конфеткой", которая утверждала, что демонстрирует, как работают QThreads, но их было слишком много, чтобы понять.Я принял ответ Дзена, потому что он показал мне именно то, чего не хватало в моих попытках, а затем добавил мою собственную в качестве примера, который я хотел увидеть. Нажмите здесь, чтобы перейти к нему: https://stackoverflow.com/a/34561122/3491308Мой первоначальный вопрос следующий:It seems I must be missing something, but I just can't seem to make this work like I think it ought to. My complete application needs to have two or three threads, all of which start (almost) together and run forever: Графический интерфейс Загружает группу объектов из файлов перед запуском двух других потоков для их обработки. Процессор реального времени Имеет TimeCriticalPriority и периодическое «прерывание» QTimer в попытке использовать ПК как гораздо более мощную встроенную систему, чем то, с чего я начал. Этот проект начинался как полностью встроенный и быстро стал слишком сложным, чтобы управлять им. Драйвер USB HID Подключается к части проекта, которая все еще встроена. Основная функциональность, конечно же, связана с потоком обработки в реальном времени, а две другие - просто для настройки того, как это работает. Таким образом, объекты обработки создаются, изменяются и уничтожаются во время работы процессора реального времени на основе действий пользователя в графическом интерфейсе пользователя, и данные внутри некоторых из этих объектов также создаются и потребляются USB.Я продолжаю искать примеры того, как использовать потоки в Qt, но все время получаю сложные приложения типа "леденец", которые загромождают потоки. Я изо всех сил пытаюсь интерпретировать их и писать свои собственные, но я продолжаю получать сбои в самой Qt, и мой небольшой проект "игровая площадка" говорит, что у меня даже нет второго потока:#ifndef MAIN_H #define MAIN_H #include class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget* parent = 0); ~MainWindow() {} private: QObject* mythingy; private slots: void deleteObject(QObject* thingy); }; class Worker : public QObject { Q_OBJECT public: Worker(QObject* thingy, QObject* parent = 0); private: QObject* mythingy; signals: void deleteObject(QObject* thingy); private slots: void doWork(); }; #endif // MAIN_H /*************** *** main.cpp *** ***************/ #include "main.h" #include int main(int argc, char* argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { mythingy = new QObject(this); QThread* thisthread = this->thread(); QThread* mainthread = QCoreApplication::instance()->thread(); //breakpoint here to check thisthread and mainthread Worker* worker = new Worker(mythingy, this); connect(worker, SIGNAL(deleteObject(QObject*)), this, SLOT(deleteObject(QObject*))); } void MainWindow::deleteObject(QObject* thingy) { QThread* thisthread = this->thread(); QThread* mainthread = QCoreApplication::instance()->thread(); //breakpoint here to check thisthread and mainthread delete thingy; } Worker::Worker(QObject* thingy, QObject* parent) : QObject(parent) { mythingy = thingy; QThread* thread = new QThread(this); this->moveToThread(thread); //use a timer to allow the constructor to exit QTimer* timer = new QTimer(this); timer->setSingleShot(true); timer->start(1000); connect(timer, SIGNAL(timeout()), this, SLOT(doWork())); QThread* thisthread = this->thread(); QThread* mainthread = QCoreApplication::instance()->thread(); //breakpoint here to check thisthread and mainthread thread->start(); } void Worker::doWork() { QThread* thisthread = this->thread(); QThread* mainthread = QCoreApplication::instance()->thread(); //breakpoint here to check thisthread and mainthread deleteObject(mythingy); } Если кто-то может опубликовать пример того, как правильно выполнять QThreads, учитывая мое описание проекта и с минимальным беспорядком (желательно короче моего, если это возможно), я был бы очень признателен.Изменить:Судя по ответу Дзена, похоже, это тоже работает:MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { mythingy = new QObject(this); QThread* thisthread = this->thread(); QThread* mainthread = QCoreApplication::instance()->thread(); Worker* worker = new Worker(mythingy, this); } Worker::Worker(QObject* thingy, QObject* parent) : QObject(0) //no real parent, so we can move to a different thread { mythingy = thingy; QTimer* timer = new QTimer(this); timer->setSingleShot(true); timer->start(1000); connect(timer, SIGNAL(timeout()), this, SLOT(doWork())); QThread* thread = new QThread(parent); this->moveToThread(thread); thread->start(); } void Worker::doWork() { QThread* thisthread = this->thread(); QThread* mainthread = QCoreApplication::instance()->thread(); delete mythingy; } Я все еще перемещаюсь внутри конструктора и удаляю объект напрямую, вместо того, чтобы указывать потоку владельца сделать это. (помните, что в полном проекте владелец уже пометил объект для удаления, но воздержался от этого, потому что другой поток мог его использовать)Что-то не так?
A

AaronD

6 лет назад

Ответов: 2

Если async-await не создает дополнительных потоков, то как он заставляет приложения реагировать?

Снова и снова я вижу, что он говорит, что использование async-await не создает дополнительных потоков. Это не имеет смысла, потому что единственные способы, с помощью которых компьютер может выполнять более одной задачи за раз, - это. На самом деле одновременное выполнение более одной задачи (параллельное выполнение, использование нескольких процессоров) Моделирование его путем планирования задач и переключения между ними (немного A, немного B, немного A и т. Д.) Итак, если async-await не выполняет ни одно из этих действий, то как это может сделать приложение отзывчивым? Если существует только 1 поток, то вызов любого метода означает ожидание завершения метода, прежде чем делать что-либо еще, а методы внутри этого метода должны дождаться результата, прежде чем продолжить, и так далее.
M

Ms. Corlib

6 лет назад

Ответов: 11

Остановка службы Java при большом количестве запущенных потоков

У меня есть многопоточная служба Java. Это приложение издатель-подписчик.Есть шина сообщений и несколько компонентов плагина, которые слушают шину сообщений. Каждый запрос от плагина обрабатывается шиной сообщений в отдельном потоке. Он работает как служба Windows.В методе остановки в настоящее время я вызываю System.exit (0). В нескольких других подобных вопросах одни люди назвали это плохой практикой, а другие утверждали, что это нормально. Даже Sonarqube жалуется на это.Так что это изящный способ остановить все эти потоки? Должен ли я вызвать на них Thread.interrupt?Эти клиенты постоянно прослушивают шину сообщений и, если получены какие-либо сообщения о событиях, обрабатывают их.
A

AnOldSoul

6 лет назад

Ответов: 1

Как увеличить поле класса в потоке в Python?

Я пытаюсь реализовать небольшой пример сада. Garden - это класс с функцией grow (), которая каждую секунду проверяет количество подаваемой воды. Когда количество воды превышает некоторый порог, в саду появляется несколько цветов.Вот моя первая попытка:Садовый классimport time class Garden: def __init__(self): self.water = 0 print("Garden built!") def grow(self): while self.water main.pyimport time from garden import Garden from threading import Thread from queue import Queue def main(): que = Queue() garden = Garden() thr = Thread(target=garden.grow).start() que_garden = que.get() water(que_garden, 20) time.sleep(5) water(que_garden, 30) thr.join() def water(garden, amount): garden.water += amount print("Watered with {0}!".format(amount)) Когда я запускаю main.py, я получаю следующий ввод:Garden built! Water supplied: 0 Water supplied: 0 Water supplied: 0 Water supplied: 0 Water supplied: 0 Итак, grow () постоянно вызывается и никогда не достигает строки water (que_garden, 20). Я ожидал, что однажды thr = Thread (target = garden.grow) .start () вызывается, он не блокируется до тех пор, пока grow () не завершится, но перейдет к следующей строке. Что мне здесь не хватает?
m

minerals

6 лет назад

Ответов: 3

What is the difference between asynchronous programming and multithreading?

I thought that they were basically the same thing — writing programs that split tasks between processors (on machines that have 2+ processors). Then I'm reading this, which says: Async methods are intended to be non-blocking operations. An await expression in an async method doesn’t block the current thread while the awaited task is running. Instead, the expression signs up the rest of the method as a continuation and returns control to the caller of the async method. The async and await keywords don't cause additional threads to be created. Async methods don't require multithreading because an async method doesn't run on its own thread. The method runs on the current synchronization context and uses time on the thread only when the method is active. You can use Task.Run to move CPU-bound work to a background thread, but a background thread doesn't help with a process that's just waiting for results to become available. and I'm wondering whether someone can translate that to English for me. It seems to draw a distinction between asyncronicity (is that a word?) and threading and imply that you can have a program that has asynchronous tasks but no multithreading. Now I understand the idea of asynchronous tasks such as the example on pg. 467 of Jon Skeet's C# In Depth, Third Edition async void DisplayWebsiteLength ( object sender, EventArgs e ) { label.Text = "Fetching ..."; using ( HttpClient client = new HttpClient() ) { Task task = client.GetStringAsync("http://csharpindepth.com"); string text = await task; label.Text = text.Length.ToString(); } } The async keyword means "This function, whenever it is called, will not be called in a context in which its completion is required for everything after its call to be called." In other words, writing it in the middle of some task int x = 5; DisplayWebsiteLength(); double y = Math.Pow((double)x,2000.0); , since DisplayWebsiteLength() has nothing to do with x or y, will cause DisplayWebsiteLength() to be executed "in the background", like processor 1 | processor 2 ------------------------------------------------------------------- int x = 5; | DisplayWebsiteLength() double y = Math.Pow((double)x,2000.0); | Obviously that's a stupid example, but am I correct or am I totally confused or what? (Also, I'm confused about why sender and e aren't ever used in the body of the above function.)
u

user5648283

6 лет назад

Ответов: 2

ускорить запись в тексбокс в wpf с прокруткой до конца?

Я долго искал способ как можно быстрее обновить многострочное текстовое поле в C # / WPF. Так что я подумал, что свяжусь с вами, ребята, и посмотрю, не могли бы вы дать мне несколько советов / подсказок или помочь.Я хочу иметь возможность выводить как можно больше данных в многострочное текстовое поле с прокруткой до конца при обновлении, данные поступают через последовательное соединение. Я сделал это на C # / Forms без проблем. Но в WPF все не так просто.Итак, если я пишу только в текстовое поле с одной строкой, то для 5000 элементов требуется 940 мс. Но для многострочного требуется 143 секунды. И если я не прокручу до конца текстового поля, то для тех же данных потребуется 112 секунд.Код создает экземпляр класса с очередью, заполняет очередь 5000 элементами, а затем пытается вывести данные в UI-> texbox как можно быстрее. Я добавляю к выходным данным отметку секундомера, чтобы видеть время для каждой функции.Отображаемый выходной форматItemValue DQ -> добавлено к отметке очереди с начала Ev -> отметка события исключена из очереди с начала TB -> время вывода текстового поля (мс) с начала ,Изображение программыЯ собрал небольшую тестовую программу, код ниже такой же, как у проекта, который можно скачать здесь -> Ссылка на проектТестовые операторы if находятся в MainWindow: TxTextAdd ()Я думал, что есть способ изменить обработку событий, чтобы она могла выводить как можно больше элементов при каждом срабатывании обработчика пользовательского интерфейса / события. Значит, мы могли печатать сразу несколько элементов, а не по одному для каждого события? Но я понятия не имею, как реализовать это решение.Есть идеи?enter using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Collections.Concurrent; using System.Diagnostics; using System.Threading; using System.Windows.Threading; namespace BlockingCollectionAsFIFO { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { /// Create FIFO class FIFO_Class FIFOqueue = new FIFO_Class(); // Display stopwatch Stopwatch DispStop = Stopwatch.StartNew(); // Holds texbox string in one of the tests string TextBox_Text = ""; public MainWindow() { InitializeComponent(); // register UI update event to populate textbox from queue dequeue FIFOqueue.UI_Update += new FIFO_Class.UI_EventHandler(TxTextAdd); string ID = "A"; /// Create new add thread in class for (int i = 0; i { try { /// Put togheter the string that we are going to display Data += " TB->" + DispStop.ElapsedMilliseconds.ToString() + "ms"; /// true => only update the one row texbox with the latest string if(true) { textbox2.Text = Data; } else { /// true => add string to TextBox_Text variable and display that (scroll to end) /// false => add string to TextBox control and scroll to end if (true) { TextBox_Text += Data + System.Environment.NewLine; textbox.Text = TextBox_Text; } else { textbox.Text += Data + System.Environment.NewLine; textbox.ScrollToEnd(); } } } catch {} })); } private void btn_RUN_Click(object sender, RoutedEventArgs e) { } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { /// Dispose alive dequeue thread FIFOqueue.Dispose(); } } class FIFO_Class { // Main Queue private BlockingCollection queue = new BlockingCollection(new ConcurrentQueue()); // Events public delegate void UI_EventHandler(string message); public event UI_EventHandler UI_Update; private Thread DeQueueThread; Stopwatch stop = Stopwatch.StartNew(); public void CreateAddThread(string ID) { Thread t = new Thread(() => Add(ID)); t.Start(); } private void Add(string ID) { /// Just add some data for (int i = 0; i " + stop.ElapsedTicks.ToString() + " ticks"; /// check if we have any subscribers on UIupdate event UI_Update_Process(Output); } } } catch (ThreadAbortException) { } } public void Dispose() { // Abort Thread. DeQueueThread.Abort(); // Wait for the thread to terminate. DeQueueThread.Join(); } // UI update Handler Event process protected void UI_Update_Process(string Data) { if (UI_Update != null) { //UI_Update(Data); UI_Update(Data + " Ev->" + stop.ElapsedTicks.ToString() + "ticks"); } } } class Package { public string ID; public int Data; } }
M

Micke Källberg

6 лет назад

Ответов: 1

ASP.net под управлением класса Thread Foreground-Threads

У меня есть быстрый вопрос относительно дополнительных потоков переднего плана, которые выполняются в веб-приложении ASP.net. Я позволяю некоторым вещам запускаться в дополнительном потоке класса Thread, таком как Cleanup-Actions, после определенного события, но пользователя не интересуют эти операции, поэтому потоки - эти операции должны просто выполняться (скорее в фоновом режиме) и им нечего делать с обслуживанием запросов. Что происходит, когда приложение вылетает из-за неперехваченного исключения - будет ли дополнительный поток выполняться до завершения или IIS немедленно его отменяет? Что происходит при перезапуске пула приложений? Я знаю, что было бы лучше использовать отдельные программы для таких заданий .. Например, служба Windows, но я «унаследовал» этот код от бывших сотрудников ..
E

Erik Mandke

6 лет назад

Ответов: 1

В чем разница между Task.Run () и Task.Factory.StartNew ()

У меня есть метод: private static void Method() { Console.WriteLine("Method() started"); for (var i = 0; i И я хочу запустить этот метод в новой Задаче. Я могу начать новую задачу вот такvar task = Task.Factory.StartNew(new Action(Method)); или этоvar task = Task.Run(new Action(Method)); Но есть ли разница между Task.Run () и Task.Factory.StartNew (). Оба они используют ThreadPool и запускают Method () сразу после создания экземпляра Task. Когда использовать первый вариант, а когда второй?
S

Sergiy Lichenko

6 лет назад

Ответов: 7

Разница между CompletableFuture, Future и Observable в RxJava

Я хотел бы узнать разницу между. CompletableFuture, Future и Observable RxJava.Как я знаю, все они являются асинхронными, но Future.get() блокирует поток CompletableFuture предоставляет методы обратного вызоваRxJava Observable --- аналогично CompletableFuture с другими преимуществами (не уверен) Например: если клиенту нужно сделать несколько вызовов сервиса, и когда мы используем Futures (Java) Future.get() будет выполняться последовательно... хотелось бы узнать, как это лучше сделать в RxJava..А в документации http://reactivex.io/intro.html говорится Использовать Futures для оптимального составления условных потоков асинхронного выполнения сложно (или невозможно, поскольку задержки каждого запроса меняются во время выполнения). Это, конечно, можно сделать, но это быстро становится сложным (и, следовательно, чревато ошибками) или преждевременно блокируется на Future.get(), что устраняет преимущество асинхронного выполнения..Очень интересно узнать, как RxJava решает эту проблему. Мне было трудно понять это из документации.
s

shiv455

6 лет назад

Ответов: 5

Безопасна ли модификация SynchronizedCollection, объединенной потоками Linq, await и Parallel.ForEach?

Ну, название объясняется само собой. Мой код выглядит примерно так:var clients = new ConcurrentBag(); var peers = new ConcurrentDictionary(); clients.Add(...); // This may happen on another thread clients.Add(...); // This may happen on another thread var token = cts.Token; while (!token.IsCancellationRequested) { if (clients.Count == 0) { // Waiting for more clients await TaskEx.Delay(500, token); // Using BCL.Async as I need to support Windows XP (.Net 4) } else if (clients.Count == 1) { // Close the left-alone client clients.FirstOrDefault()?.Close(); // Close may remove or modify **_clients**. } else if (clients.Any(c => c.DataAvailable)) { // There is some data, let see if we have timed out peers from last time foreach (var p in peers.Where(peer => !peer.Key.IsCompleted)) { // Close the timed out clients, will also terminate the task p.Value.Close(); // Close may remove or modify **_clients**. } peers.Clear(); // Checking for possible operations and filling the array Parallel.ForEach(clients.Where(c => c.DataAvailable), (item) => { Parallel.ForEach(clients.Where(c => !c.Equals(item)), (item2) => { peers.TryAdd(item2.Broadcast(item.Data), item2); //Broadcast may add, remove or modify **_clients**. }); }); // Minimum of 10 secs for operations to run before getting timedout await TaskEx.WhenAny(TaskEx.WhenAll(peers.Keys.ToArray()), TaskEx.Delay(10000, token)); // Using BCL.Async as I need to support Windows XP (.Net 4) // Even tho some of them may have timed out by now, as we may have no data for the next operation, we will wait for data before deciding to close them } else { // Waiting for some data to appear - Recheck as soon as OS allows us await TaskEx.Delay(1, token); // Using BCL.Async as I need to support Windows XP (.Net 4) } } Как вы можете видеть, я использовал ConcurrentBag и ConcurrentDictionary наряду с методами await, Linq, Simple foreach, Parallel.ForEach и BCL.Async..Поскольку я впервые использую Parallel, ConcurrentBag и ConcurrentDictionary, я хочу попросить людей, более знакомых с этими частями Framework, рассказать мне, есть ли проблемы в логике, безопасности потоков и/или новых способах выполнения задач.Я весь внимание, спасибо заранееEDITСогласно документации MSDN, упомянутой в ответе Ивана, для большей безопасности мне следует удалить метод .Where() и включить его в тело Parallel.ForEach в качестве if.Но все же мало что известно о методах .FirstOrDefault() и .Any() и их ситуации с потоковой безопасностью. Я знаю, что хорошей практикой является использование lock каждый раз, когда происходит обращение к переменной. Но в данном случае, поскольку я использую ConcurrentBag, я хочу быть уверенным в необходимости копирования переменной перед выполнением этих строк кода:if (clients.Any(client => client.IsConnected)) { clients.FirstOrDefault()?.Close(); // Close may remove or modify **_clients**. ЭДИТ 2Разобрав методы .FirstOrDefault() и .Any(), я обнаружил, что оба они используют простой foreach. Поэтому я считаю, что они все-таки должны быть потокобезопасными. Итак, теперь вопрос: Возможно ли запустить Parallel.ForEach внутри другого Parallel.ForEach с тем же источником, а затем изменить этот источник? Или мне следует изменить логику? Parallel.ForEach(clients, (item) => { if (item.DataAvailable) { Parallel.ForEach(clients, (item2) => { if (!item2.Equals(item)) { // Modify **clients**
S

Soroush Falahati

6 лет назад

Ответов: 1

Interlocked.CompareExchange(ref value, newValue,compareTo)

using System; using System.Threading; using System.Threading.Tasks; namespace _1._41_Compare_and_Exchange_as_a_nonAtomic_operation { public class Program { static int value = 1; public static void Main() { Task t1 = Task.Run(() => { if (value == 1) { Thread.Sleep(1000); value = 2; } }); Task t2 = Task.Run(() => { value = 3; }); Task.WaitAll(t1, t2); Console.WriteLine(value); //Displays 2 } } } Я пытаюсь преобразовать приведенную выше неатомарную операцию в атомарную, используя :Interlocked.CompareExhange(ref value, newValue, compareTo); который я написал как Interlocked.CompareExhange(ref value, value, value); //This doesn't look right! иInterlocked.CompareExhange(ref value, t2, t1); //will not compile Вопросы При наличии или отсутствии Interlocked.CompareExchange значение выводится как 2? Почему? Как правильно ссылаться на t1, t2? Почему я не могу ссылаться на вывод задачи напрямую? (значение, t2, t1) Необходимо ли какое-то преобразование или даже нужно ли оно вообще? Как я понимаю, значение должно быть обновлено до 2 (значение = 1), затем обновлено до 3 вместо текущего вывода (значение = 1, обновляется до 3, затем обновляется до 2) после использования Interlocked.CompareExchange?
J

Johnathan Enslin

6 лет назад

Ответов: 1

Операции CompareAndSet переопределение значений

Просматривая раздел "Блокирующие/неблокирующие алгоритмы" на ссылкеи приведенный ниже код для объяснения операции Atomic compareAndSetboolean updated = false; while(!updated){ long prevCount = this.count.get(); updated = this.count.compareAndSet(prevCount, prevCount + 1); } В нем говорится, что Поэтому нет необходимости в синхронизации, и нет необходимости в приостановке потока. не требуется. Это экономит накладные расходы на приостановку потоков. Означает ли это, что если в приведенном выше коде 2 потока одновременно вызовут compareAndSet(), то оба они будут выполняться совместно или параллельно, в отличие от синхронизированного блока, где один поток блокируется, если оба обращаются одновременно? Если это так, то не будут ли значения перезаписаны в вышеупомянутом случае? И то же самое происходит в случае отсутствия синхронизации?
g

ghostrider

год назад

Ответов: 1

Как создать диспетчер coroutine для текущего потока?

Возможно ли создать Dispatcher для текущего потока? Посмотрите этот пример кода в качестве примера того, чего я хочу добиться:val dispatcher = if (parallel) { Dispatcher.Default } else { // Что я должен написать здесь, чтобы просто использовать текущий поток для запуска doStuff? } val deferredList = list.map { async(dispatcher) { doStuff(it) } }
B

Brais Gabin

год назад

Ответов: 2

Как перенаправить stdin в несколько процессов java, одновременно получая вывод

Я пытаюсь написать java-программу для запуска нескольких процессов и перенаправления stdin основной программы в оба этих процесса, одновременно считывая вывод из этих процессов в stdout.На данный момент я пытаюсь запустить процессы vlc и позже планирую иметь возможность управлять ими обоими по отдельности, используя разные клавиши клавиатуры, но я хотел бы понять, как заставить это работать для любого процесса, например, для командной строки или пользовательского клиента telnet, чтобы можно было породить две командные строки и послать одинаковые команды обоим, или программно заменить части команд, идущих каждому процессу.Проблема в том, что непредсказуемо, какой конец будет отправлять, поэтому мне нужен по сути двунаправленный канал или оба канала должны работать одновременно. Я не могу понять, как это сделать, все, что я пробовал, заставляет его зависать в ожидании ввода с любой стороны.Я могу запустить два процесса vlc и даже прочитать оба их вывода, но я не могу отправить им stdin без того, чтобы процессы не зависли в ожидании ввода. Вот что у меня уже есть:Родительский класс: package multiVLC; import java.nio.file.Path; import java.nio.file.Paths; public class multiVLC { public static void main(String[] args) { Path video1 = Paths.get("C:\\path\\to\\video1.mkv"); Path video2 = Paths.get("C:\\path\\to\\video2.mkv"); new VLCProcess(video1).start(); new VLCProcess(video2).start(); } } А процесс:package multiVLC; import java.io.*; import java.nio.file.Path; import java.util.Scanner; public class VLCProcess extends Thread { private Path videofile; public VLCProcess(Path videofile) { this.videofile = videofile; } public void run() { try { String[] cmd = {"C:\\Program Files\\VideoLAN\\VLC\\vlc.exe", videofile.toRealPath().toString()}; ProcessBuilder ps = new ProcessBuilder(cmd); ps.redirectErrorStream(true); // combine stdErr and stdOut Process pr = ps.start(); BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream())); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(pr.getOutputStream())); BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in)); String line; Scanner scanin = new Scanner(in); Scanner scansysin = new Scanner(sysin); while (true) { // THIS HANGS if (scanin.hasNextLine()) { System.out.println(this.getName() + ":" + scanin.nextLine()); } if (scansysin.hasNextLine()) { out.write(scansysin.nextLine()); } System.out.println("still in loop"); // NEVER PRINTS } // while ((line = in.readLine()) != null) { // THIS WORKED TO RUN TWO VLC PROCESSES, BUT DOESN'T REDIRECT STDIN // System.out.println(this.getName() + ":" + line); // } // pr.waitFor(); // not sure if this is needed } catch (IOException e) { e.printStackTrace(); } } } Как правильно обрабатывать трубы в обоих направлениях?
l

localhost

год назад

Ответов: 1

Может ли клиент paho-mqtt подключаться к нескольким брокерам одновременно?

Я хочу, чтобы мой клиент издателя MQTT мог подключаться к нескольким брокерам одновременно. Тема в данном случае одна и та же, просто задействовано несколько брокеров. Будет ли для такой цели использоваться многопоточность? Или есть какой-то другой выход.
S

Surabhi Sharma

год назад

Ответов: 1

Параллельное выполнение нескольких пар параллельных задач

Подробности: У меня есть игра с двумя независимыми ИИ, играющими друг против друга. У каждого ИИ есть своя задача. Обе задачи должны запускаться в одно и то же время, принимать некоторые параметры и возвращать значение. Теперь я хочу запустить 100-200 игр (с каждой из двух задач) параллельно. Проблема, с которой я столкнулся, заключается в том, что эти две задачи не запускаются вместе. Они запускаются совершенно случайно, когда есть свободные ресурсы. Код: Мой текущий подход выглядит следующим образом. У меня есть список объектов ввода, которые включают в себя некоторые параметры. - С помощью Parallel.ForEach я создаю для каждого объекта ввода игру и два ИИ для этой игры. - Тот ИИ, который первым завершает игру, останавливает другой ИИ, играющий в ту же игру, с помощью CancellationToken. - Все возвращаемые значения сохраняются в ConcurrentBag. Поскольку при этом две AI-задачи для каждой игры не запускаются вместе, я добавил AutoResetEvent. Я надеялся, что смогу подождать с одной задачей, пока не запустится вторая задача, но вместо этого AutoResetEvent.WaitOne блокирует все ресурсы. В результате AutoResetEvent приводит к тому, что первые AI-задачи запускаются и ждут запуска второй задачи, но поскольку они не освобождают потоки снова, они ждут вечно. private ConcurrentBag<Individual> TrainKis(List<Individual> population) { ConcurrentBag<Individual> resultCollection = new ConcurrentBag<Individual>(); ConcurrentBag<Individual> referenceCollection = new ConcurrentBag<Individual>(); Parallel.ForEach(population, individual => { GameManager gm = new GameManager(); CancellationTokenSource c = new CancellationTokenSource(); CancellationToken token = c.Token; AutoResetEvent waitHandle = new AutoResetEvent(false); KI_base eaKI = new KI_Stupid(gm, individual.number, "KI-" + individual.number, Color.FromArgb(255, 255, 255)); KI_base referenceKI = new KI_Stupid(gm, 999, "REF-" + individual.number, Color.FromArgb(0, 0, 0)); Individual referenceIndividual = CreateIndividual(individual.number, 400, 2000); var t1 = referenceKI.Start(token, waitHandle, referenceIndividual).ContinueWith(taskInfo => { c.Cancel(); return taskInfo.Result; }).Result; var t2 = eaKI.Start(token, waitHandle, individual).ContinueWith(taskInfo => { c.Cancel(); return taskInfo.Result; }).Result; referenceCollection.Add(t1); resultCollection.Add(t2); }); return resultCollection; } Это метод запуска ИИ, при котором я жду, пока второй ИИ начнет играть: public Task<Individual> Start(CancellationToken _ct, AutoResetEvent _are, Individual _i) { i = _i; gm.game.kis.Add(this); if (gm.game.kis.Count > 1) { _are.Set(); return Task.Run(() => Play(_ct)); } else { _are.WaitOne(); return Task.Run(() => Play(_ct)); } } И упрощенный метод игры public override Individual Play(CancellationToken ct) { Console.WriteLine($"{player.username} started."); while (Constants.TOWN_NUMBER*0.8 > player.towns.Count || player.towns.Count == 0) { try { Thread.Sleep((int)(Constants.TOWN_GROTH_SECONDS * 1000 + 10)); } catch (Exception _ex) { Console.WriteLine($"{player.username} error: {_ex}"); } //here are the actions of the AI (I removed them for better overview) if (ct.IsCancellationRequested) { return i; } } if (Constants.TOWN_NUMBER * 0.8 <= player.towns.Count) { winner = true; return i; } return i; } Есть ли лучший способ сделать это, сохранив все вещи, но обеспечив одновременный запуск двух KI-заданий в каждой игре?
t

theoretisch

год назад

Ответов: 1

2022 WebDevInsider