如何强制线程停止,python

2024-10-02 18:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的代理项目中,有时服务器进程(由教师给出)以一个错误(一个以404开头的字符串)结束,所以我希望发送请求的线程停止而不继续。我试过用“return”或“return”系统出口()”但这似乎阻止了一切,代理停止接收请求和创建线程。为什么?在

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()

Tags: importforreturnifrequestsocketconnaddr
1条回答
网友
1楼 · 发布于 2024-10-02 18:25:46

使用return是正确的方法(不过,您应该在执行此操作之前关闭连接)。在

正如大卫建议的那样:

request = conn.recv(512)

可能是罪魁祸首。如果建立了连接但没有发送数据,则主线程将被锁定。更不用说请求可能比512大。在

将这一行移到receivePage函数内(不要将request传递给Thread构造函数)并让我们知道它是否有效。在

相关问题 更多 >