Python释放线程

时间:2015-07-13 07:52:02

标签: python multithreading

我第一次使用来自线程类的线程,并且它们似乎在函数运行后自由释放。我试图一次运行最多5个线程。由于一个线程创建了下一个线程,所以会有一些重叠,但是在我得到异常之前我一次看到2000多个线程正在运行"无法启动新线程"。

from threading import Thread
import string

URLS = ['LONG LIST OF URLS HERE']

currentThread = 0
LASTTHREAD = len(URLS) - 1
MAXTHREADS = 5
threads = [None] * (LASTTHREAD + 1)

def getURL(threadName, currentThread):
  print('Thread Name = ' + threadName)
  print('URL = ' + str(URLS[currentThread]))
  if currentThread < LASTTHREAD:
    currentThread = currentThread + 1
    thisThread = currentThread
    try:
      threads[thisThread] = Thread(target = getURL, args = ('thread' + str(thisThread), currentThread, ))
      threads[thisThread].start()
      threads[thisThread].join()
    except Exception,e:
      print "Error: unable to start thread"
      print str(e)

for i in range(0, MAXTHREADS):
  currentThread = currentThread + 1
  try:
    threads[i] = Thread(target = getURL, args = ('thread' + str(i), currentThread, ))
    threads[i].start()
    threads[i].join()
  except Exception,e:
    print "Error: unable to start thread"
    print str(e)

我可以接受任何其他清理工作,我也可以在这里工作,因为我对python很新,而且对于线程来说是全新的。我此刻正试图正确设置线程。最终这将刮掉URL。

1 个答案:

答案 0 :(得分:0)

我建议查看一个线程池,让线程从合适的共享数据结构(例如队列)中获取任务,而不是始终启动新线程。

根据您实际想要做的事情,如果您正在使用CPython(如果您不知道CPython的意思,那么您将会这样做)您实际上可能无法获得任何性能提升使用线程(由于全局解释器锁定)。因此,您可能最好不要查看多处理模块。

<?php if (
stristr($ua, "Windows CE") or
stristr($ua, "AvantGo") or
stristr($ua,"Mazingo") or
stristr($ua, "Blazer") ) {
  $DEVICE_TYPE="MOBILE";
}
if (isset($DEVICE_TYPE) and $DEVICE_TYPE=="MOBILE") {
  $location='mobile/index1.php';
  header ('Location: '.$location);
  exit;
}
?>