Why my thread can't access the global data?

ddh doudehou at gmail.com
Wed Dec 21 02:13:10 EST 2005


Hi,
  I got a problem. I use a 'select' in a loop in the main thread, and
when select return, a new thread will be created to handle the network
event. And if the client send some special string, the thread will
change a global flag to false, so the loop in the main thread will
break. But it never work.

Below is the code:
--------------------- s.py (the server) --------------------------
import socket
import select
import thread
import sys

go_on = True

def read_send(s):
	s.setblocking(1)
	str = s.recv(1024)
	print 'recv:', str
	s.send(str)
	s.close()
	if (str == 'quit'):
		go_on = False
		print 'User quit...with go_on =', go_on
	return


s = socket.socket(socket.AF_INET)
s.bind(('', 9999))
s.listen(5)
s.setblocking(0)

while go_on:
	r_set = [s.fileno(),]
	r, w, e = select.select(r_set,[],[],0.5)
	print 'select returned with go_on =', go_on
	for rs in r:
		if rs == s.fileno():
			ns, addr = s.accept()
			print 'socket on', addr, 'has been accepted'
			thread.start_new_thread(read_send, (ns,))
s.close()


--------------------- c.py (the client) --------------------------
import socket
import sys

if len(sys.argv) != 3:
	print 'usage: python c.py ip port'
	sys.exit(-1)

ip = sys.argv[1]
port = int(sys.argv[2])
s = socket.socket(socket.AF_INET)
s.settimeout(5)
s.connect((ip, port))
str = raw_input('please input:')
s.send(str)
str = s.recv(1024)
print 'received:', str
s.close()

--------------------------------------------------------------------------
run s.py first, and then run c.py as:
python c.py 127.0.0.1 9999
and then input 'quit', but the server never end :(



Thank you for your help!




More information about the Python-list mailing list