🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
10 messages
10 total messages Started by królewna Mon, 21 Dec 2009 15:06
Multiprocessing i timeout
#27078
Author: królewna
Date: Mon, 21 Dec 2009 15:06
19 lines
1953 bytes
Czy jest jakaś możliwość aby multiprocessing.connection.Client podczas 
tworzenia połączenia miał podawany parametr działający na zasadzie 
timeout? Bo obecnie próbując połączyć się z niedziałającym procesem, 
proces, który wywołuje funkcje klienta czeka w nieskończoność. Czy będę 
musiała przepisać część kodu z biblioteki po swojemu? Bo z tego co widzę 
to klasa Client jest tak naprawdę tylko wrapperem, który wywołuje 
odpowiednią klasę dla argumentu o odpowiednim rodzaju(mi chodzi o 
obiekty typu socket) i nie za bardzo sama ma jakieś inne pola.

Czy może zastosować lepiej jakieś inne rozwiązania do komunikacji między 
dwoma programami? Bo różnicy pomiędzy normalnymi socketami z 
picklowaniem a multiprocessing.connection nie widzę (jedynie co 
zaobserwowałam to to, że przesyłanie przez multiprocessing.connection 
jest szybsze) i właściwie do tej pory stosowałam je wymiennie (ze 
względu na łatwość wysyłania i odbierania obiektów przez connection).

Czym także różnią się oba sposoby jeśli chcę po prostu wysyłać obiekty 
między dwoma obiektami? Czym te dwa sposoby różnią się od BaseManager 
przy takiej samej sytuacji?
Re: Multiprocessing i timeout
#27079
Author: Bart Ogryczak
Date: Mon, 21 Dec 2009 15:35
8 lines
1568 bytes
On Dec 21, 4:06 pm, królewna <krole...@ee.pl> wrote:
> Czy jest jakaś możliwość aby multiprocessing.connection.Client podczas
> tworzenia połączenia miał podawany parametr działający na zasadzie
> timeout?

Może klasycznie uniksowe rozwiązanie:

http://www.python.org/doc/2.6.4/library/signal.html#example
Re: Multiprocessing i timeout
#27080
Author: Łukasz Rekucki
Date: Mon, 21 Dec 2009 16:30
16 lines
2037 bytes
On Dec 21, 4:35 pm, Bart Ogryczak <b.ogryc...@gmail.com> wrote:
> On Dec 21, 4:06 pm, królewna <krole...@ee.pl> wrote:
>
> > Czy jest jakaś możliwość aby multiprocessing.connection.Client podczas
> > tworzenia połączenia miał podawany parametr działający na zasadzie
> > timeout?
>
> Może klasycznie uniksowe rozwiązanie:
>
> http://www.python.org/doc/2.6.4/library/signal.html#example

Jak widać nie pomyśleli o tym, ale można użyć
http://docs.python.org/library/socket.html#socket.setdefaulttimeout
tuż przed wywołaniem Client(). Powinno to ustawić timeout na sockecie,
który stworzy SocketClient(). PipeClient() wydaje się mieć ustawiony
na sztywno timeout 1000ms.
Re: Multiprocessing i timeout
#27081
Author: królewna
Date: Tue, 22 Dec 2009 09:24
15 lines
1708 bytes
W dniu 21.12.2009 17:30, Łukasz Rekucki pisze:

> Jak widać nie pomyśleli o tym, ale można użyć
> http://docs.python.org/library/socket.html#socket.setdefaulttimeout
> tuż przed wywołaniem Client(). Powinno to ustawić timeout na sockecie,
> który stworzy SocketClient(). PipeClient() wydaje się mieć ustawiony
> na sztywno timeout 1000ms.

Przyznam, że nie rozumiem w jaki sposób to działa. Tworzę nowy obiekt 
klasy socket zupełnie nie związany z obiektem klasy Client, zmieniam na 
nim timeout i to działa na obiekcie Clienta. Jaka jest zasada działania 
tego? Czyli jak zmienię na jednym obiekcie klasy socket np timeout to 
ten timeout zmienia się na wszystkich?

królewna
Re: Multiprocessing i timeout
#27082
Author: Bart Ogryczak
Date: Tue, 22 Dec 2009 09:29
25 lines
2527 bytes
On Dec 22, 10:24 am, królewna <krole...@ee.pl> wrote:
> W dniu 21.12.2009 17:30, Łukasz Rekucki pisze:
>
> > Jak widać nie pomyśleli o tym, ale można użyć
> >http://docs.python.org/library/socket.html#socket.setdefaulttimeout
> > tuż przed wywołaniem Client(). Powinno to ustawić timeout na sockecie,
> > który stworzy SocketClient(). PipeClient() wydaje się mieć ustawiony
> > na sztywno timeout 1000ms.
>
> Przyznam, że nie rozumiem w jaki sposób to działa. Tworzę nowy obiekt
> klasy socket zupełnie nie związany z obiektem klasy Client, zmieniam na
> nim timeout i to działa na obiekcie Clienta. Jaka jest zasada działania
> tego? Czyli jak zmienię na jednym obiekcie klasy socket np timeout to
> ten timeout zmienia się na wszystkich?

Nie. Importujesz moduł socket. Zmieniasz domyślny timeout. Wszystkie
sockety utworzone po tej zmianie będą miały taki timeout.
Np.

import socket
socket.setdefaulttimeout(twój_timeout)
...

klient = multiprocessing.connection.Client() # ten klient będzie miał
twój timeout.
Re: Multiprocessing i timeout
#27083
Author: królewna
Date: Tue, 22 Dec 2009 09:46
18 lines
1696 bytes
W dniu 22.12.2009 10:29, Bart Ogryczak pisze:

>
> Nie. Importujesz moduł socket. Zmieniasz domyślny timeout. Wszystkie
> sockety utworzone po tej zmianie będą miały taki timeout.
> Np.
>
> import socket
> socket.setdefaulttimeout(twój_timeout)
> ...
>
> klient = multiprocessing.connection.Client() # ten klient będzie miał
> twój timeout.

Oh, przepraszam. Byłam prawie pewna, że właśnie zrobiłam tak jak 
napisałam i zadziałało więc mnie to zdziwiło. Ale najwidoczniej 
napisałam tak jak radziłeś bo teraz sprawdzam i rzeczywiście działa tak 
jak opisujesz.
Re: Multiprocessing i timeout
#27084
Author: William Bonawentura
Date: Wed, 23 Dec 2009 07:12
8 lines
1439 bytes
Użytkownik "Łukasz Rekucki" <lrekucki@gmail.com> napisał w wiadomości 
news:5e45a27a-4515-40c1-b098-f5f2724be64c@r24g2000yqd.googlegroups.com...

> Jak widać nie pomyśleli o tym, ale można użyć
> http://docs.python.org/library/socket.html#socket.setdefaulttimeout

Z zastrzeżeniem, że to jest zmiana globalna - na wszystkie wątki. 
Re: Multiprocessing i timeout
#27085
Author: Daniel Mróz
Date: Sat, 26 Dec 2009 17:17
45 lines
2426 bytes
On 23.12.2009, William Bonawentura <news@ipartners.pl> wrote:
>> Jak widać nie pomyśleli o tym, ale można użyć
>> http://docs.python.org/library/socket.html#socket.setdefaulttimeout
> Z zastrzeżeniem, że to jest zmiana globalna - na wszystkie wątki. 
Dlatego najlepiej timeouty implementować na select.select lub select.*Poll,
np. (piszę z pamięci, więc może nie działać, ale ogólną zasadę Królewna
wyczai):


sock = socket.socket(<co tam potrzeba>)
sock.setblocking(0)
poller = select.poll()
poller.register(sock.fileno(), select.POLLOUT)
try:
    sock.connect(<co tam potrzeba>)
except socket.error, e:
    if e.args[0] not in (errno.EINPROGRESS, errno.EALREADY, errno.EWOULDBLOCK):
	sock.close()
        raise
    else:
        pass
except:
    sock.close()
    raise
events = poller.poll(<wybrany timeout>)
if not events:
    sock.close()
    raise JakiśTamWyjątek('Connect timeout')
sock.setblocking(1)


W Pythonie 3.0 już są AFAIR timeouty per obiekt gniazda, a nie
globalne, ale nie pamiętam czy obejmowały one przekroczenia czasu
połączenia, czy tylko timout transferu danych.



Pozdrawiam
Beorn

-- 
Daniel 'Beorn' Mróz <beorn@alpha.pl>    http://127.0.0.1/beorn
[GIT d s:- a-@ C++++ UL++++$ P+ L++++ E--- W+ N+++ o? K- w---]
[O- M- V!  PS+ PE++ Y+ PGP++ t- 5  X R !tv b+ DI D++ G++ e h*]
[                          r++  y+                           ]
Re: Multiprocessing i timeout
#27086
Author: William Bonawentura
Date: Wed, 30 Dec 2009 07:01
9 lines
1408 bytes
Użytkownik "Daniel Mróz" <beorn@alpha.pl> napisał w wiadomości 
news:slrnhjchh0.h9g.beorn@pino.cyberdeck.pl...
>
>
> W Pythonie 3.0 już są AFAIR timeouty per obiekt gniazda, a nie
> globalne, ale nie pamiętam czy obejmowały one przekroczenia czasu

Są i w 2.6 
Re: Multiprocessing i timeout
#27088
Author: Łukasz Rekucki
Date: Wed, 30 Dec 2009 14:44
23 lines
2472 bytes
On Dec 30, 8:01 am, "William Bonawentura" <n...@ipartners.pl> wrote:
> Użytkownik "Daniel Mróz" <be...@alpha.pl> napisał w wiadomościnews:slrnhjchh0.h9g.beorn@pino.cyberdeck.pl...
>
>
>
> > W Pythonie 3.0 już są AFAIR timeouty per obiekt gniazda, a nie
> > globalne, ale nie pamiętam czy obejmowały one przekroczenia czasu
>
> Są i w 2.6

W każdej wersji gdzie jest setsockopt()! Ale w ogóle nie o to tu
chodziło. Problem był taki, że konstruktor klasy
http://docs.python.org/library/multiprocessing.html#multiprocessing.connection.Client
, który wewnętrznie tworzy sobie socket do którego nie masz dostępu,
nie przyjmuję takiej opcji.


>> Jak widać nie pomyśleli o tym, ale można użyć
>> http://docs.python.org/library/socket.html#socket.setdefaulttimeout

> Z zastrzeżeniem, że to jest zmiana globalna - na wszystkie wątki.
W kontekście multiprocessing, jakoś bym się tym nie martwił ;), ale
tak - należy o tym pamiętać
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads