[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [linux-team] exec.. fork et threads
>
> 3) quelqu'un a t-il de l'experience avec les threads sous linux ? ca
> marche bien ? y'a le meme en C++ (genre comme en Java) ? Quelqu'un connait
> des endroits ou trouver des docs ?
>
Pour autant que je me rappelle, tout dépend de ta version de glibc.
Avec les anciennes, il faut réinstaller une lib supplémentaire. Avec
les nouveaux, ça doit être d'origine. J'avais fait un truc en Python
il y a quelques temps pour interroger plusieurs moteurs de recherche
html en //, mais j'ai oublié depuis.
Le C++ ne supporte pas les threads en std (faut réécrire tes propres
classes). Modula-3 est une bonne alternative parmi les langages
compilés. Il supporte aussi le garbage collection. Et par rapport à
Java, c'est du code natif, et il y a les generic classes (équivalent
des templates).
En attachement, le script en question, si tu veux jouer un peu avant de
te lancer. Y'a pas de commentaires, faudra que tu te débrouilles tout
seul comme un grand. Mais c'est pas trop compliqué. C'est juste que
le code est alourdi par le locking.
Rem : si quelqu'un "perfectionne" ce script, soit en y ajoutant des
moteurs supplémentaires, soit en améliorant ceux qui existent
(transformation des URLs relatives en URLs absolues, notamment), je
serai heureux d'avoir le feedback. Merci.
Michel
---
John Keating: Why do we need language ?
Neil Perry : To communicate...
John Keating: Nooo ! To woo women !
- Dead Poets Society -
#!/usr/local/bin/python
import traceback
from time import sleep
import string
import thread
import urllib
import cgi
httplib_lock = thread.allocate_lock()
class SearchEngine :
def __init__( self ) :
self.Lock = thread.allocate_lock()
self.Retrieved = 0
self.CanPrint = 0
self.Printed = 0
def EscapeQueryString( self, s ) :
s = string.strip( s )
s = string.joinfields( string.splitfields( s, " " ), "+" )
s = urllib.quote( s, "/+:&?" )
return s
def Main( self, qs ) :
try :
self.Query = self.MakeQueryString( qs )
httplib_lock.acquire()
self.Answer = urllib.urlopen( self.Query )
httplib_lock.release()
self.Lock.acquire()
self.Retrieved = 1
self.Lock.release()
myTurn = 0
while not myTurn :
sleep( 1 )
self.Lock.acquire()
if self.CanPrint :
myTurn = 1
self.Lock.release()
print "\n<hr>\n<H1 align=center>Results from", self.Name, "</H1>\n<hr>"
print
self.PrintResult()
print "\n\n<H2 align=center>End of the results from", self.Name, "</H2>\n<hr>"
self.Answer.close()
self.Lock.acquire()
self.Printed = 1
self.Lock.release()
except :
self.Lock.acquire()
self.Printed = 1
self.CanPrint = 1
self.Retrieved = 1
self.Lock.release()
traceback.print_exc()
# self.Answer.close()
class Excite( SearchEngine ) :
def __init__( self ) :
SearchEngine.__init__( self )
self.Name = "Excite"
self.Url = "http://www.excite.com/"
def MakeQueryString( self, s ) :
return self.Url + "search.gw?trace=a&search=" + self.EscapeQueryString( s )
def PrintResult( self ) :
filter = 0
for line in self.Answer.readlines() :
if string.find( line, "Ad Start" ) != -1 :
filter = 1
if not filter :
print line
if string.find( line, "Ad Stop" ) != -1 :
filter = 0
class InfoSeek( SearchEngine ) :
def __init__( self ) :
SearchEngine.__init__( self )
self.Name = "InfoSeek"
self.Url = "http://www.infoseek.com/"
def MakeQueryString( self, s ) :
return self.Url + "Titles?qt=" + self.EscapeQueryString( s ) + "&col=WW&sv=IS&lk=noframes&nh=10"
def PrintResult( self ) :
for line in self.Answer.readlines() :
print line
class EuroSeek( SearchEngine ) :
def __init__( self ) :
SearchEngine.__init__( self )
self.Name = "EuroSeek"
self.Url = "http://www.euroseek.net/"
def MakeQueryString( self, s ) :
return self.Url + "query?iflang=uk&query=" + self.EscapeQueryString( s ) + "&domain=world&lang=world"
def PrintResult( self ) :
for line in self.Answer.readlines() :
if string.find( line, "Advertisment!" ) == -1 :
print line
def Search( s ) :
qs = s,
Engines = Excite(), InfoSeek(), EuroSeek()
print "Starting search on"
print "<UL>"
for e in Engines :
print "<LI>" + e.Name
thread.start_new_thread( e.Main, qs )
print "</UL>"
Finished = 0
while not Finished :
sleep( 1 )
SomeOnePrinting = 0
for e in Engines :
e.Lock.acquire()
if e.Retrieved and e.CanPrint and not e.Printed :
e.Lock.release()
SomeOnePrinting = 1
break
e.Lock.release()
if not SomeOnePrinting :
for e in Engines :
e.Lock.acquire()
if e.Retrieved and not e.CanPrint :
e.CanPrint = 1
e.Lock.release()
SomeOnePrinting = 1
break
e.Lock.release()
if not SomeOnePrinting :
Finished = 1
for e in Engines :
e.Lock.acquire()
if not e.Printed :
e.Lock.release()
Finished = 0
break
e.Lock.release()
# blah blah
# blah blah
# blah blah
print "Content-type: text/html"
print
print "<HTML>"
print "<Head><Title>MultiSearch results</Title></Head>"
print "<Body>"
form = cgi.FieldStorage()
if form.has_key( "qs" ) :
qs = form[ "qs" ].value
Search( qs )
else :
print "Your Search is empty !"
print "</Body></HTML>"