还是无法阻止线程

时间:2013-04-24 20:37:30

标签: python multithreading pycurl

我想用简单的CTR + C来停止线程,但是数据会一直存在,所以我必须关闭窗口并重新启动它。请帮我解决问题。为了看看我在说什么,只需在用户中键入您的推特用户名和密码并传递

import threading
import random
import time
import Queue
import urllib2
import sys
import simplejson, pycurl
import sys, signal

queue = Queue.Queue()
keep_running = True
user = "" # username
pswd = "" # password
headers = [ "Content-Type: text/xml; charset: UTF-8; "]

class MyThread(threading.Thread):


    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue
        self.buffer = ""
        self.streaming_url = "https://stream.twitter.com/1/statuses/filter.json?track=justinbieber"

    def start_crawl(self, user, pswd):
        self.conn = pycurl.Curl()
        self.conn.setopt(pycurl.USERPWD, "%s:%s" % (user, pswd))
        self.conn.setopt(pycurl.URL, self.streaming_url)
        #self.conn.setopt(pycurl.POST, 1)
        self.conn.setopt(pycurl.HTTPHEADER, headers)
        self.conn.setopt(pycurl.READFUNCTION, self.storage)
        self.conn.setopt(pycurl.VERBOSE, 1)
        self.conn.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_BASIC)
        self.conn.perform()


    def storage(self, data):
        self.buffer += str(data)
        if isinstance(self.buffer, str):
            if self.buffer.endswith("\r\n") and self.buffer.strip():
                content = json.loads(self.buffer)
                self.buffer = ""
                self.queue.put(content)
                self.queue.task_done()
                #if "text" in content:
                    #print u"{0[user][name]}: {0[text]}".format(content)
        else:
            return data

    def run(self):
        while keep_running:
            self.start_crawl(user,pswd)
            if signal.signal(signal.SIGINT, signal.SIG_DFL):
                sys.exit()
            #line = self.names[random.randint(0,len(self.names)-1)]
            #queue.put(line)


class Starter():
    def __init__(self):
        self.queue = queue
        t = MyThread(self.queue)
        t.start()
        self.next()

    def next(self):
        while True:
            time.sleep(0.1)
            if not self.queue.empty():
                line = self.queue.get(timeout=0.2)
                print line, self.queue.qsize()
            else:
                print 'waiting for queue'

def main():  
    try:
        Starter()   
        queue.join()  
    except KeyboardInterrupt, e:
        print 'Stopping'
        global keep_running
        keep_running = False
        #Join all existing threads to main thread.
        for thread in threading.enumerate():
            if thread is not threading.currentThread():
                thread.join()
        sys.exit(1)

main()

1 个答案:

答案 0 :(得分:2)

将该线程设置为守护进程,它将被您的程序杀死

import threading
import random
import time
import Queue
import urllib2
import sys
import simplejson, pycurl
import sys, signal

queue = Queue.Queue()
keep_running = True
user = "" # username
pswd = "" # password
headers = [ "Content-Type: text/xml; charset: UTF-8; "]

class MyThread(threading.Thread):


    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue
        self.buffer = ""
        self.streaming_url = "https://stream.twitter.com/1/statuses/filter.json?track=justinbieber"

    def start_crawl(self, user, pswd):
        self.conn = pycurl.Curl()
        self.conn.setopt(pycurl.USERPWD, "%s:%s" % (user, pswd))
        self.conn.setopt(pycurl.URL, self.streaming_url)
        #self.conn.setopt(pycurl.POST, 1)
        self.conn.setopt(pycurl.HTTPHEADER, headers)
        self.conn.setopt(pycurl.READFUNCTION, self.storage)
        self.conn.setopt(pycurl.VERBOSE, 1)
        self.conn.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_BASIC)
        self.conn.perform()


    def storage(self, data):
        self.buffer += str(data)
        if isinstance(self.buffer, str):
            if self.buffer.endswith("\r\n") and self.buffer.strip():
                content = json.loads(self.buffer)
                self.buffer = ""
                self.queue.put(content)
                self.queue.task_done()
                #if "text" in content:
                    #print u"{0[user][name]}: {0[text]}".format(content)
        else:
            return data

    def run(self):
        while keep_running:
            self.start_crawl(user,pswd)
            if signal.signal(signal.SIGINT, signal.SIG_DFL):
                sys.exit()
            #line = self.names[random.randint(0,len(self.names)-1)]
            #queue.put(line)


class Starter():
    def __init__(self):
        self.queue = queue
        t = MyThread(self.queue)
        t.daemon = True
        t.start()
        self.next()

    def next(self):
        while True:
            time.sleep(0.1)
            if not self.queue.empty():
                line = self.queue.get(timeout=0.2)
                print line, self.queue.qsize()
            else:
                print 'waiting for queue'

def main():  
    try:
        Starter()   
        queue.join()  
    except KeyboardInterrupt, e:
        print 'Stopping'
        raise

main()