搬马

导航

 

socketserver模块源码中没找到get_request()的方法,原因????

服务器端--------------------------------------------------
import socketserver


class MyServer(socketserver.BaseRequestHandler):    # 定义一个类,必须要继承括号中的类
    def handle(self):   # 这个方法名字只能是这个,因为父类中也有这个方法,此处是重写这个方法的。
        # while True:   #这个循环不要加,加了之后意外断开会出问题。
        conn = self.request
        while True:
            try:
                data = conn.recv(1024)
            except Exception:
                print("对方意外中断!")
                break
            if not data:
                break
            print(str(data, "utf8"))
            inp = input(">>>>:")
            conn.send(bytes(inp, "utf8"))
        conn.close()


server1 = socketserver.ThreadingTCPServer(("127.0.0.1", 8000), MyServer)   # 此处容易忘记添加上面定义的类
server1.serve_forever()



客户端-------------------------------------------------------------
import socket

sk = socket.socket()
ip_port = ("127.0.0.1",8000)
sk.connect(ip_port)

while True:
    inp = input(">>>>>:")
    if inp == "exit":
        break
    sk.send(bytes(inp, "utf8"))
    data = sk.recv(1024)
    print(str(data, "utf8"))
sk.close()

 

线程:

计算密集型任务、I/O密集型的任务

 

线程的两种创建方法:

(1)实例化Thread类,传入函数:

import threading


def foo(num):
    print('this is thread %s' % num)


t1 = threading.Thread(target=foo(1))
t2 = threading.Thread(target=foo(2))
t1.start()    # this is thread 1
t2.start()    # this is thread 2
print(t1.getName())    # Thread-1
print(t2.getName())    # Thread-2

 

(2)从Thread派生一个子类,创建这个子类的实例

import threading


class MyThread(threading.Thread):
    def __init__(self, num):
        threading.Thread.__init__(self)
        self.num = num

    def run(self):
        print("this is thread %s" % self.num)


t1 = MyThread(1)
t2 = MyThread(2)
t1.start()    # this is thread 1
t2.start()    # this is thread 2

 

join():在子线程完成运行之前,这个子线程的父线程将一直被阻塞。

 

import threading
import time


def music(func):
    for i in range(2):
        print("Begin listening to %s . %s" % (func, time.ctime()))
        time.sleep(1)
        print("end listening  %s" % time.ctime())


def movie(func):
    for i in range(2):
        print("Begin watching %s  .  %s" % (func, time.ctime()))
        time.sleep(5)
        print("end watching %s" % time.ctime())


threads = []
t1 = threading.Thread(target=music, args=("七里香",))
threads.append(t1)
t2 = threading.Thread(target=movie, args=("阿甘正传",))
threads.append(t2)

if __name__ == '__main__':
    for t in threads:
        t.start()
    t.join()    # t2进程结束后,主线程才继续执行
    print("all over ..........%s" % time.ctime())

 

setDaemon():将线程设置为守护线程,设置为守护线程的线程,它守护着主线程,主进程结束了,它也就结束了。

import threading
import time


def music(func):
    for i in range(2):
        print("Begin listening to %s . %s" % (func, time.ctime()))
        time.sleep(1)
        print("end listening  %s" % time.ctime())


def movie(func):
    for i in range(2):
        print("Begin watching %s  .  %s" % (func, time.ctime()))
        time.sleep(5)
        print("end watching %s" % time.ctime())


threads = []
t1 = threading.Thread(target=music, args=("七里香",))
threads.append(t1)
t2 = threading.Thread(target=movie, args=("阿甘正传",))
threads.append(t2)

if __name__ == '__main__':
    t2.setDaemon(True)  #将t2设置为守护线程,
    for t in threads:
        t.start()
    print("all over ..........%s" % time.ctime())

 

Threading的其它方法:

# threading.currentThread(): 返回当前的线程变量。
# threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
# threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
# 除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:
# run(): 用以表示线程活动的方法。
# start():启动线程活动。
# join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
# isAlive(): 返回线程是否活动的。
# getName(): 返回线程名。
# setName(): 设置线程名。

 

posted on 2018-07-18 14:31  搬马  阅读(118)  评论(0编辑  收藏  举报