[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>"