通过Python脚本理解系统线程

本文介绍了一个简单的Python TCP服务器与客户端程序实例。该服务器利用socket库实现多线程处理,能够接收客户端消息并返回带有当前时间戳的响应。客户端通过循环发送消息并接收服务器反馈。
from socket import *  #导入socket包中的所有内容
from time import ctime  #导入time包,同时在本地可使用ctime进行调用
import thread #导入Python线程包

HOST='localhost' #定义主机
PORT=21567 #定义端口
BUFSIZ=1024 #定义缓冲区
ADDR=(HOST,PORT) #定义元组

tcpSerSock=socket(AF_INET,SOCK_STREAM)  #生成socket
tcpSerSock.bind(ADDR) #将地址及端口元组与socket绑定
tcpSerSock.listen(1) #监听用户请求

def client(tcpCliSock,num): #定义函数。由于thread强行要求调用的函数必须有两个参数。num只是充数,没有特别含义
    CliSock=tcpCliSock #将传递进来的客户端socket赋值给CliSock
    while True: #定义无限循环
        data=CliSock.recv(BUFSIZ) #从用户socket中读取1024大小数据
        if not data: #如果客户端没有任何输入,即直接回车或Ctrl+D
            break #跳出无限循环
        CliSock.send('[%s] %s' %(ctime(),data)) #返回用户输入并附加当前系统时间
    sys.exit #结束进程

while True: #定义无限循环
    print "waiting ...." #打印等待用户输入时的waiting
    tcpCliSock,addr=tcpSerSock.accept() #处理用户请求
    print 'con from :',addr #打印客户端信息
    thread.start_new_thread(client,(tcpCliSock,1))    #在Python中使用线程就靠这句了!Python会开始一个新的线程来运行client函数并以元组的形式传递给这个函数参数!

tcpSerSock.close() #这句依然不会执行!

threading是官方推荐编写线程使用的模块。还是有必要了解thread的,不仅可以让我们更加了解系统线程的运行方式,也能找到thread与threading及Queue之间的区别,进而更好的学习掌握threading!

下面是Python客户端程序。如果你可以使用telnet进行测试,那么以下内容可以忽略。
from socket import *

HOST='localhost'
PORT=21567
BUFSIZ=1024
ADDR=(HOST,PORT)

tcpCliSock=socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)

while True:
    data=raw_input("> ")
    if not data:
        break
    tcpCliSock.send(data)
    data=tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    print data

tcpCliSock.close()

<think>好的,用户现在想了解如何在Python脚本中使用threading模块增加线程。根据之前的对话,用户可能已经接触过Java中获取HTTP参数的方法,现在转向Python线程的问题。需要结合用户提供的四个引用内容来回答,同时保持回答的结构清晰和实用。 首先,用户的问题明确,需要具体的使用方法。根据引用[1],Thread类有两种创建方式:传递函数和继承子类。引用[3]也提到了传入函数和参数创建Thread实例。所以应该分步骤讲解这两种方法。 引用[2]提到了join()方法的作用,防止主线程提前结束,这点需要在代码示例中强调,确保用户理解其重要性。另外,引用[4]中的示例代码展示了继承Thread类并重写run方法的方式,这也需要包含在回答中。 用户可能对线程的基本概念不熟悉,所以需要简要说明线程的作用,比如并发执行任务。同时,要提到多线程在I/O密集型任务中的应用,如网络请求或文件操作,但也要指出Python的GIL限制在CPU密集型任务中的效果有限,避免用户误解。 在步骤部分,应该分点详细说明两种创建方式,并给出代码示例。比如,第一种方法传递函数,需要展示如何定义目标函数,创建Thread实例,并启动线程。第二种方法继承Thread类,覆盖run方法,并实例化启动。 此外,需要强调线程启动必须用start()而不是直接调用run(),否则无法并发。引用[2]中的join()方法也需要在代码示例中展示,说明如何阻塞主线程直到子线程完成。 最后,用户可能想知道线程的应用场景和注意事项,比如参数传递、资源竞争等。需要提醒使用锁机制(threading.Lock)来处理共享资源,避免竞态条件。 在相关问题部分,可以提出线程同步、守护线程、GIL的影响等,帮助用户进一步学习。确保引用正确的来源,比如引用[1]和[3]提到的基本用法,引用[2]的join方法,引用[4]的继承方式。 总结回答结构:先介绍threading模块的基本用法,分两种方法详细说明,给出代码示例,强调关键点(start和join),然后补充注意事项和应用场景,最后相关问题引导深入学习。</think>以下是Python使用`threading`模块实现多线程的详细步骤,结合您提供的引用内容整理: ### 一、基础实现方法 #### 方法1:通过函数创建线程(引用[1][3]) ```python import threading import time # 定义线程执行的函数 def task(name, delay): print(f"{name}线程启动") for i in range(3): time.sleep(delay) print(f"{name}执行第{i+1}次操作") # 创建线程实例 thread1 = threading.Thread(target=task, args=("下载任务", 1)) thread2 = threading.Thread(target=task, kwargs={"name": "数据处理", "delay": 0.5}) # 启动线程 thread1.start() thread2.start() # 等待线程结束(引用[2]) thread1.join() thread2.join() print("主线程结束") ``` #### 方法2:通过继承Thread类创建(引用[1][4]) ```python class MyThread(threading.Thread): def __init__(self, name): super().__init__() self.name = name def run(self): # 必须重写run方法 print(f"{self.name}开始执行") time.sleep(2) print(f"{self.name}执行完成") # 使用自定义线程类 t = MyThread("后台计算线程") t.start() t.join() ``` ### 二、关键特性说明 1. **参数传递**: - 位置参数通过`args`元组传递 - 关键字参数通过`kwargs`字典传递 - 支持所有Python数据类型作为参数 2. **必要操作**(引用[2][3]): - `start()`:启动线程(不可直接调用`run()`) - `join([timeout])`:阻塞主线程直到子线程完成 - `is_alive()`:检测线程状态 3. **线程属性**: ```python print(t.name) # 线程名称 print(t.ident) # 线程ID print(t.daemon) # 是否为守护线程 ``` ### 三、应用场景建议 - I/O密集型任务:文件操作、网络请求(引用[3]) - 后台定时任务 - 并行处理多个独立任务 - GUI程序保持响应(非CPU密集型场景) > **注意**:Python的GIL(Global Interpreter Lock)限制多线程在CPU密集型任务中的性能提升,此类场景建议使用`multiprocessing`模块[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值