多线程的问题,请各位老大帮忙解决,谢谢!!

多线程的问题,请各位老大帮忙解决,谢谢!!

各位,帮小弟解决一个问题,原代码:
Flag = 0
Result = []
class mythread(threading.thread):
      def __init__(self,sname):
          threading.thread.__init__(sefl,name = sname)
      ....
      def run(self):
          global Flag
          global Result
          Lock.acquire()
          Flag += 1
          Lock.release()
          ....
          Lock.acquire()
          Result.append(value)
          Lock.release()
          ...
      def __del__(self):
          global Flag
          Lock.acquire()
          Flag -= 1
          Lock.release()
for x in range(1,11):
      ...
      t = 't' + str(x)
      t = mythread(t)
      t.start()
      ...

程序运行后:
1、在线程没有关闭之前,Flag = 10,threading.activeCount和threading.enumerate()却都是11个线程,除10个线程外,还有一个<_MainThread(MainThread, started)>;
2、各线程逐渐执行完毕,最后只剩第一个线程t1和上面那个主线程,但在查看日志后没有发现线程t10关闭的信息,看结果应该是主线程取代了t10;
3、也是最主要的一个问题,在过一段时间后线程t1运行结束并正常关闭,当前活动线程列表中就只剩下一个主线程,但问题是这个主线程并没有关闭,一直运行,这是我抓的信息:
runging: <_MainThread(MainThread, started)>
threadlist: [<_MainThread(MainThread, started)>]
threadcount: 1
Flag:1
在使用CTRL+C强行终止后,出现:
t10:Flag - 1:None
Thread t10 Close.
也就是说Flag的值为None,不能进行自减操作,但我在Flag自增操作后输出Flag的结果,显示是正常的,关于这个问题,我的疑问是:1、前面9个线程的所有操作包括自增自减等都正常,Flag的值在t10完成自减操作后应该等于0才对,怎么会变为None?2、我使用except:语句检测,即便是不能执行成功,线程应该在输出错误信息后随之关闭才对,主线程也就是t10线程怎么会一直循环?
我刚刚又测了一下,在run()的最后一个语句执行之后Flag = 1,而在__del__的第一次语句之前怎么就是None ?
我是想实现端口扫描,建立socket->循环并建立线程->分别执行一定数量端口的扫描任务->线程结束程序退出。
在程序最后输出扫描结果时由于无法检测所有扫描线程是否都结束,所以我使用了Flag来检测,每个线程在开始时Flag += 1,在结束时Flag -= 1,当Flag == 0时标志所有线程扫描结束,这样我就可以打印扫描结果,所以才使用了__del__,所以问题也就出来了。
另外需要请教,为什么不能使用__del__,有什么问题吗?
还有如果开10个线程的话,前9个线程在结束时都能正常运行__del__里面的语句,为什么最后一个线程不行呢?
去掉__del__确实可以让程序正确执行,但我还是不明白到底是怎么回事?

另外把“socket(AF_INET,SOCK_STREAM)”放在调用线程类的循环的前面(1)和放在每个线程的开始处(2)以及放在线程里每个连接的开始处(3),好像对connect((addr,port))的执行有影响:
     如果放在(1)处,执行时偶尔会成功(就是有结果),但好多时候还是不行,进入connect循环后没多久就退出了,但SOMAXCONN = 2147483647,应该不存在这种问题的,不理解;
     如果放在(2)处,程序可以执行,但开始1000个线程,那就要建立1000个socket,这样对程序性能是个问题;
     如果放在(3)处,和(2)的结果差不多甚至更严重些,开始65535个端口扫描,就要建立65535个socket,资源浪费是相当严重的,而且应该没这个必要。


    还有经过测试,使用settimeout()设置超时时间,对连接速度比较快的网络或主机来说(可以访问的),设置为很小的数(如1)不影响使用,对目的地址无法访问或连接延时较大时有影响。