Ведение блога в ИТ

User avatar
Sergunka
Уже с Приветом
Posts: 34124
Joined: 03 Dec 2000 10:01
Location: Vladivostok->San Francisco->Los Angeles->San Francisco

Re: Ведение блога в ИТ

Post by Sergunka »

crypto5 wrote:
Sergunka wrote: Опа-на, точно лажанулся :D - уже исправил в блоге.
А в чем смысл while(true) {...} ? Все равно получается возможна только одна итерация цикла?
Здесь я следовал кальке в методе ран в потоке. Думаю можно убрать while вместе с break нафиг.
"A patriot must always be ready to defend his country against his government." Edward Abbey
User avatar
crypto5
Уже с Приветом
Posts: 4637
Joined: 24 Oct 2009 01:38
Location: Chicago ;-) -> SFBA!

Re: Ведение блога в ИТ

Post by crypto5 »

Sergunka wrote:
crypto5 wrote:
Sergunka wrote: Опа-на, точно лажанулся :D - уже исправил в блоге.
А в чем смысл while(true) {...} ? Все равно получается возможна только одна итерация цикла?
Здесь я следовал кальке в методе ран в потоке. Думаю можно убрать while вместе с break нафиг.
Еще непонятно почему барбер закрывает офис если нету клиентов. По условиям задачи он вроде должен уснуть?..
Еще обычно для барбера лучше юзать single thread executorservice с blocking queue внутри, и сабмитить в него клиентов как Runnable или Callable, всю логику барбера возьмет на себя ExecutorService
In vino Veritas!
User avatar
Sergunka
Уже с Приветом
Posts: 34124
Joined: 03 Dec 2000 10:01
Location: Vladivostok->San Francisco->Los Angeles->San Francisco

Re: Ведение блога в ИТ

Post by Sergunka »

crypto5 wrote:
Sergunka wrote:
crypto5 wrote:
Sergunka wrote: Опа-на, точно лажанулся :D - уже исправил в блоге.
А в чем смысл while(true) {...} ? Все равно получается возможна только одна итерация цикла?
Здесь я следовал кальке в методе ран в потоке. Думаю можно убрать while вместе с break нафиг.
Еще непонятно почему барбер закрывает офис если нету клиентов. По условиям задачи он вроде должен уснуть?..
Офис закрывается если долгое время которое определяется в OFFICE_CLOSE нет клиента. Согласен комментарий не очень удачный сейчас перепишу, что мол де время ожидания клиента истекло и в зале ожидания никого нет.

Code: Select all

                        Integer i = this.queue.poll(OFFICE_CLOSE, TimeUnit.MILLISECONDS);
                        if (i==null) break; // no more clients in the queue - close office

Я сделал это исключительно чтоб не убивать процесс - походу удобно для тестирования.
"A patriot must always be ready to defend his country against his government." Edward Abbey
User avatar
crypto5
Уже с Приветом
Posts: 4637
Joined: 24 Oct 2009 01:38
Location: Chicago ;-) -> SFBA!

Re: Ведение блога в ИТ

Post by crypto5 »

Да, это мелочь. А вот с ExecutorService лучше разобраться. У нас например в конторе сразу с тревогой смотрят на код, создающий свой собственный тред, так как высока вероятность что где то будут всякие сложно вылавлимые ошибки. А в случае с ExecutorService все надежнее, уже реализовано, и сложности спрятаны за удобным АПИ.
In vino Veritas!
User avatar
Sergunka
Уже с Приветом
Posts: 34124
Joined: 03 Dec 2000 10:01
Location: Vladivostok->San Francisco->Los Angeles->San Francisco

Re: Ведение блога в ИТ

Post by Sergunka »

crypto5 wrote:Да, это мелочь. А вот с ExecutorService лучше разобраться. У нас например в конторе сразу с тревогой смотрят на код, создающий свой собственный тред, так как высока вероятность что где то будут всякие сложно вылавлимые ошибки. А в случае с ExecutorService все надежнее, уже реализовано, и сложности спрятаны за удобным АПИ.
Здесь без вопросов в реальной имплементации лучше применить известный дизайн патерн тот же http://docs.oracle.com/javase/1.5.0/doc ... cutor.html с очередью с блокировкой сработает очень надежно.

Задача всеж на интервью состоит в том чтоб еще и покодить :fr: перед ашалевшей публикой :D
"A patriot must always be ready to defend his country against his government." Edward Abbey
User avatar
dotcom
Уже с Приветом
Posts: 9035
Joined: 25 Oct 2011 19:02
Location: SVO->ORD->SFO

Re: Ведение блога в ИТ

Post by dotcom »

Sergunka wrote: Задача всеж на интервью состоит в том чтоб еще и покодить :fr: перед ашалевшей публикой :D
Ну если приходить на интервью со своими собственными вопросами, то публика действительно ошалеет. :D А сколько раз про barber'а спрашивали на интервью?
User avatar
Sergunka
Уже с Приветом
Posts: 34124
Joined: 03 Dec 2000 10:01
Location: Vladivostok->San Francisco->Los Angeles->San Francisco

Re: Ведение блога в ИТ

Post by Sergunka »

dotcom wrote:А сколько раз про barber'а спрашивали на интервью?
В той или иной форме всегда на интервью есть задачи по синхронизации. У меня был прикол два подряд интервью просили написать свою реальзацию очереди с блокировкой. На втором интервью я вроде как отписал нормально - получил офер.
"A patriot must always be ready to defend his country against his government." Edward Abbey
User avatar
valchkou
Уже с Приветом
Posts: 4185
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: Ведение блога в ИТ

Post by valchkou »

Sergunka wrote: Согласен, что задача выполнена не по спекам как завещал Дейкстра

В моей интерпретации как в общем-то и в большинстве других на просторах интернета клиент заходит в зал ожидания (т.е. у меня в очередь с блокировкой) а потом уже парикмахер разбирается с ним. Здесь есть свои плюсы и минусы.
в такой постановке, интересность задачи не тянет на блог для чувака за 150ка.
ну че там 2 метода: offer(), pull() и все решение !
у тебя клиент это не поток, а фактически сообщение которое поставили в очередь на обработку.

Задача дейкстры становится в разы интереснее если взглянуть на нее под другим углом.
Допустим что киенты, как и парикмакер - потоки.
Клиенты конкурируют за стул и время парикмакера и место в зале ожидания.
Парикмакер же за стул не конкурирует, но конкурирует за возможность поспать.
Вот тогда и начинается самое интересное.
Задача принимает нужную форму, клиенты-потоки идут спать и будятся, как только стул освободился.
Парикмакер наоборот идет спать если стул свободен и просыпается когда он становится занят.
ikatkov
Новичок
Posts: 73
Joined: 28 Apr 2005 17:27
Location: San Francisco Bay Area, CA

Re: Ведение блога в ИТ

Post by ikatkov »

а зачем вообще потоки и очереди в задаче про парикмахера?
Разве это не типичная задача для finite state machine? Нужен только один thread и заранее предсказуемое количество памяти для любого количества клиентов и парикмахеров.
User avatar
valchkou
Уже с Приветом
Posts: 4185
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: Ведение блога в ИТ

Post by valchkou »

ikatkov wrote:а зачем вообще потоки и очереди в задаче про парикмахера?
предложите свое решение на java,
к слову сергей единственный кто это сделал, все остальные только умничают, включая меня
User avatar
crypto5
Уже с Приветом
Posts: 4637
Joined: 24 Oct 2009 01:38
Location: Chicago ;-) -> SFBA!

Re: Ведение блога в ИТ

Post by crypto5 »

ikatkov wrote:а зачем вообще потоки и очереди в задаче про парикмахера?
Разве это не типичная задача для finite state machine? Нужен только один thread и заранее предсказуемое количество памяти для любого количества клиентов и парикмахеров.
Видимо потому что эту задачу так сформулировал Дейкстра, у него парикмахер и клиенты это разные процессы выполнения кода.
In vino Veritas!
User avatar
Интеррапт
Уже с Приветом
Posts: 17281
Joined: 07 Sep 2011 10:05
Location: Seattle, WA

Re: Ведение блога в ИТ

Post by Интеррапт »

valchkou wrote: предложите свое решение на java,
В смысле? Вы никогда имплементацию не видели? Ну так гуглится на раз-два:

http://www.cs.helsinki.fi/u/kerola/rio/ ... arber.java
User avatar
valchkou
Уже с Приветом
Posts: 4185
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: Ведение блога в ИТ

Post by valchkou »

Интеррапт wrote:
valchkou wrote: предложите свое решение на java,
В смысле? Вы никогда имплементацию не видели? Ну так гуглится на раз-два:

http://www.cs.helsinki.fi/u/kerola/rio/ ... arber.java
ну что так официально, нет я про привет конкретно, только сергей посмел выложить свою, хоть и кривую, но не постеснялся. У меня тоже был свой вариант, кстати таже с 3 семафорами, по типу вышеприведенного примера, с небольшими различиями, но я полинился разукрасить его
User avatar
crypto5
Уже с Приветом
Posts: 4637
Joined: 24 Oct 2009 01:38
Location: Chicago ;-) -> SFBA!

Re: Ведение блога в ИТ

Post by crypto5 »

valchkou wrote:
Интеррапт wrote:
valchkou wrote: предложите свое решение на java,
В смысле? Вы никогда имплементацию не видели? Ну так гуглится на раз-два:

http://www.cs.helsinki.fi/u/kerola/rio/ ... arber.java
ну что так официально, нет я про привет конкретно, только сергей посмел выложить свою, хоть и кривую, но не постеснялся. У меня тоже был свой вариант, кстати таже с 3 семафорами, по типу вышеприведенного примера, с небольшими различиями, но я полинился разукрасить его
Так и быть, выложу на досуге свой вариант с ForkJoinPool-ом :D
In vino Veritas!
User avatar
Интеррапт
Уже с Приветом
Posts: 17281
Joined: 07 Sep 2011 10:05
Location: Seattle, WA

Re: Ведение блога в ИТ

Post by Интеррапт »

valchkou wrote:ну что так официально
Ну а что вы хотели?
User avatar
crypto5
Уже с Приветом
Posts: 4637
Joined: 24 Oct 2009 01:38
Location: Chicago ;-) -> SFBA!

Re: Ведение блога в ИТ

Post by crypto5 »

Вот свой вариант набросал:

Code: Select all

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


public class Barber {
	static ExecutorService barber = new ThreadPoolExecutor(
      1,
      1,
      0,
      TimeUnit.MILLISECONDS,
      new LinkedBlockingQueue<Runnable>(20),
      new ThreadPoolExecutor.AbortPolicy());
	
  public static void main(String args[]) {
  	for(int i = 0; i < 100; i ++) {
  		new Client().start();
  	}
  }
  
  static class Client extends Thread {
  	@Override
  	public void run() {
  		Future<Void> v = barber.submit(new Callable<Void>() {
				@Override
				public Void call() throws Exception {
					Thread.currentThread().sleep(1000);
					return null;
				}
			});
  		try {
				v.get();
			} catch (InterruptedException | ExecutionException e) {
				e.printStackTrace();
			}
  	}
  }
}
In vino Veritas!
User avatar
valchkou
Уже с Приветом
Posts: 4185
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: Ведение блога в ИТ

Post by valchkou »

Интеррапт wrote:Ну а что вы хотели?
хотел в гугл податься, но глянул на код крипто и понял, что нифига в жаве не рублю.
крипто, почему твои варианты ответов не выгугливаются?
User avatar
crypto5
Уже с Приветом
Posts: 4637
Joined: 24 Oct 2009 01:38
Location: Chicago ;-) -> SFBA!

Re: Ведение блога в ИТ

Post by crypto5 »

valchkou wrote:
Интеррапт wrote:Ну а что вы хотели?
хотел в гугл податься, но глянул на код крипто и понял, что нифига в жаве не рублю.
крипто, почему твои варианты ответов не выгугливаются?
Потому что я его 10 минут назад написал, эту страницу форума гугл видимо еще не успел проиндексировать :D
In vino Veritas!
User avatar
Интеррапт
Уже с Приветом
Posts: 17281
Joined: 07 Sep 2011 10:05
Location: Seattle, WA

Re: Ведение блога в ИТ

Post by Интеррапт »

crypto5 wrote:Потому что я его 10 минут назад написал, эту страницу форума гугл видимо еще не успел проиндексировать :D
Что-то вы там гугловцы тормозите. Когда же риал-тайм индексация будет?
User avatar
crypto5
Уже с Приветом
Posts: 4637
Joined: 24 Oct 2009 01:38
Location: Chicago ;-) -> SFBA!

Re: Ведение блога в ИТ

Post by crypto5 »

Интеррапт wrote:
crypto5 wrote:Потому что я его 10 минут назад написал, эту страницу форума гугл видимо еще не успел проиндексировать :D
Что-то вы там гугловцы тормозите. Когда же риал-тайм индексация будет?
Это не ко мне, я по части рекламы :gen1:
In vino Veritas!
User avatar
Интеррапт
Уже с Приветом
Posts: 17281
Joined: 07 Sep 2011 10:05
Location: Seattle, WA

Re: Ведение блога в ИТ

Post by Интеррапт »

Ну раз пошла такая пьянка, то и мы парикмахера напишем:

Code: Select all

class Barber:
    event = threading.Event()

    def cut_hair(self, customer):
        print "CUSTOMER {}: haircut (begin)".format(customer.id)
        self.event.clear()
        time.sleep(AVG_HAIRCUT_TIME)
        print "CUSTOMER {}: haircut (end)".format(customer.id)

    def sleep(self):
        self.event.wait()

    def wake_up(self):
        self.event.set()
        
        
class Customer:
    id = None

    def __init__(self, id):
        self.id = id


class BarberShop:
    barber = None
    pending_customers = []

    def __init__(self):
        BarberShop.lock = threading.Lock()
        self.barber = Barber()
        th = threading.Thread(target=self.do_work)
        th.start()

    def do_work(self):
        while True:
            BarberShop.lock.acquire()
            if len(self.pending_customers) > 0:
                customer = self.pending_customers.pop(0)
                BarberShop.lock.release()
                self.barber.cut_hair(customer)
            else:
                BarberShop.lock.release()
                print "BARBER: No customers, time to nap..."
                self.barber.sleep()
                print 'BARBER: New customer has arrived, wake up!'

    def enter(self, customer):
        BarberShop.lock.acquire()
        print "CUSTOMER {}: entered a shop".format(customer.id)

        if len(self.pending_customers) == NUMBER_OF_SEATS:
            BarberShop.lock.release()
            print "CUSTOMER {}: Wow, barber shop is full, I'm out of here!".format(customer.id)
        else:
            print "CUSTOMER {}: No worries, I'll wait".format(customer.id)
            self.pending_customers.append(customer)
            BarberShop.lock.release()
            self.barber.wake_up()
User avatar
crypto5
Уже с Приветом
Posts: 4637
Joined: 24 Oct 2009 01:38
Location: Chicago ;-) -> SFBA!

Re: Ведение блога в ИТ

Post by crypto5 »

А вот если окажется что барберов 10, то мне нужно будет одну цифру поменять, а ты будешь плодить баги и дедлоки :radio%:
In vino Veritas!
User avatar
Интеррапт
Уже с Приветом
Posts: 17281
Joined: 07 Sep 2011 10:05
Location: Seattle, WA

Re: Ведение блога в ИТ

Post by Интеррапт »

crypto5 wrote:А вот если окажется что барберов 10, то мне нужно будет одну цифру поменять, а ты будешь плодить баги и дедлоки :radio%:
Просто тебе стыдно стало, что ты кучу потоков развел на ровном месте.
User avatar
crypto5
Уже с Приветом
Posts: 4637
Joined: 24 Oct 2009 01:38
Location: Chicago ;-) -> SFBA!

Re: Ведение блога в ИТ

Post by crypto5 »

Интеррапт wrote:
crypto5 wrote:А вот если окажется что барберов 10, то мне нужно будет одну цифру поменять, а ты будешь плодить баги и дедлоки :radio%:
Просто тебе стыдно стало, что ты кучу потоков развел на ровном месте. Джавис, что тут скажешь.
Столько же сколько и ты развел :-)
In vino Veritas!
User avatar
Интеррапт
Уже с Приветом
Posts: 17281
Joined: 07 Sep 2011 10:05
Location: Seattle, WA

Re: Ведение блога в ИТ

Post by Интеррапт »

crypto5 wrote:
Интеррапт wrote:
crypto5 wrote:А вот если окажется что барберов 10, то мне нужно будет одну цифру поменять, а ты будешь плодить баги и дедлоки :radio%:
Просто тебе стыдно стало, что ты кучу потоков развел на ровном месте. Джавис, что тут скажешь.
Столько же сколько и ты развел :-)
Да я даже не про этот конкретный случай, а про F/J Pool c I/O операциями :D

Return to “Работа и Карьера в IT”