简体   繁体   中英

How to force a thread to stop, python

in my Proxy Project sometimes the Server process (given by teacher) ends with an error (a string beginning with 404) so I would like my thread, which had sent the requests, to stop and not to go on. I have tried with "return" or with "sys.exit()" but this seems to block everything and the Proxy stops receiving requests and creating threads. Why?

from socket import *
from threading import *
import sys
import colors 
import os
import time

def startPrefetch(pagesToPrefetch, mutex):
    for i in pagesToPrefetch:
        print i

def receivePage(conn, addr, request, mutex):
    HOSTSERVER = "127.0.0.1"
    SERVERPORT = 55555
    socketRequestServer = socket(AF_INET, SOCK_STREAM)
    socketRequestServer.connect((HOSTSERVER, SERVERPORT))
    socketRequestServer.send(request)

    finalResponse = ''

    while True:
        partialResponse = socketRequestServer.recv(64)
        if (not partialResponse): break
        finalResponse = finalResponse+partialResponse        

    if (finalResponse[0] == '4'):
        c = colors.colors()
        print c.ERROR + finalResponse + "INTERNAL SERVER ERROR"
        print c.WHITE
        return
        #sys.exit(1)


    socketRequestServer.close()      
    conn.sendall(finalResponse)
    conn.close()

    pagesToPrefetch = []

    sourceToString = finalResponse.split(' ')
    for i in sourceToString:
        if (len(i) != 0):
            if (i[0] == '<'):
                pagesToPrefetch.append(i)

    startPrefetch(pagesToPrefetch, mutex)


if __name__ == '__main__':
    HOST = '127.0.0.1'
    PORT = 55554

    print 'Creating socket'
    socketProxy = socket(AF_INET, SOCK_STREAM)

    print 'bind()'
    socketProxy.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    socketProxy.bind((HOST, PORT))

    #Cache directory and mutex for it
    mutex = Semaphore(1)
    try:
        os.mkdir("cache")
    except OSError:
        print 'Created cache directory'

    while True:
        print 'Waiting for connection request'
        socketProxy.listen(1)
        conn, addr = socketProxy.accept()

        print 'Connected to ', addr

        request = conn.recv(512)        

        receiver = Thread(target = receivePage, args = (conn, addr, request, mutex))
        receiver.start()

Using return is the correct way ( well, you should close connections before doing that, though ).

As David suggested this line:

request = conn.recv(512)

is probably the culprit. If the connection is made but no data is sent then the main thread will be locked. Not to mention that the request might be bigger then 512.

Move that line inside receivePage function ( and don't pass request to Thread constructor ) and let us know whether it works.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM