Python学习笔记(一)

来源:互联网 发布:古龙群侠传数据修改 编辑:程序博客网 时间:2024/06/06 13:43

         

1  .netstat -no 这个命令是察看端口的,并且可以通过pid察看是哪些程序在用这些端口!


2  在Python中或其它语言中,利用Socket编写服务器和客户端通信程序,经常会遇到一个错误:
socket.error: [Errno 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次这个提示会在端口冲突的时候出现,可能的原因是在服务器程序中创建一个Socket打开一个端口后,在程序结束的时候没有关闭这个Socket,因此下

次启动程序就会出现这个错误提示,解决方法:1、在服务器程序结束的时候要关闭Socket  2、或者更换端口号  3、重启机器


3 ipconfig 查看本机的ip


4. AttributeError: 'module' object has no attribute "funSalaryGuide"这个错误相信很多django的开发人员都会遇到。一般来说都是应用没有安装完成,重新安装就可以了


5.pyc文件,是python编译后的字节码(bytecode)文件。只要你运行了py文件,python编译器就会自动生成一个对应的pyc字节码文件。这个pyc字节码文件,经过python解释器,会生成机器码运行(这也是为什么pyc文件可以跨平台部署,

类似于java的跨平台,java中JVM运行的字节码文件)。下次调用直接调用pyc,而不调用py文件。直到你这个py文件有改变。python解释器会检查pyc文件中的生成时间,对比py文件的修改时间,如果py更新,那么就生成新的pyc。


6.t = MyThread(2)

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    t = MyThread(2)
  File "C:\Users\bsamsung\Desktop\Python27\线程\join.py", line 7, in __init__
    theading.Thread.__init__(self)
NameError: global name 'theading' is not defined

就像遇到这个问题 ,Python并不会提前编译程序,她先运行,当遇到哪里错了,才开始停下来

 

7.accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。


8.xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器。

 

9。python 中的if __name__ == ‘main’:

语句输入需要使用的模块。
   每个模块都有一个内置的变量__name__。在模块自己运行的时候,该__name__就等于'main',而如果被其他的模块import,则该模块的__name__就等于模块名,也就是文件名去掉py扩展名的部分。

如下例子:
test.py
def test():
    print "test is running"

if __name__ == "__main__":#自运行时调用该程序块
    print "test main is working"

if __name__ == "test":#import时调用该程序块
    print "test is invoked"

 

 


10.非阻塞或异步编程

例如,对于一个聊天室来说,因为有多个连接需要同时被处理,所以很显然,阻塞或同步的方法是不合适的,这就像买票只开了一个窗口,佷多人排队等一样。那么我们如何解决这个问题呢?主要有三种方法:forking、threading、异步

I/O。

Forking和threading的方法非常简单,通过使用SocketServer服务类的min-in类就可以实现。forking只适用于类Unix平台;threading需要注意内存共享的问题。
异步I/O如果底层的方法来实现是有点困难的。要简单点,我们可以考虑使用标准库中的框架或Twisted(Twisted是一个非常强大的异步网络编程的框架)。

一、用ScoketServer实现Forking和threading

下面我们使用两个例子来分别创建forking服务器和threading服务器。

Forking 服务器:

from SocketServer import TCPServer, ForkingMixIn, StreamRequestHandler

class Server(ForkingMixIn, TCPServer): pass

class Handler(StreamRequestHandler):
    def handle(self):
        addr = self.request.getpeername()
        print 'Got connection from', addr
        self.wfile.write('Thank you for connecting')

server = Server(('', 1234), Handler)
server.serve_forever()

threading服务器:

from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler

class Server(ThreadingMixIn, TCPServer): pass

class Handler(StreamRequestHandler):
    def handle(self):
        addr = self.request.getpeername()
        print 'Got connection from', addr
        self.wfile.write('Thank you for connecting')

server = Server(('', 1234), Handler)
server.serve_forever()

二、使用select实现异步I/O

所谓异步I/O,打个比方,就是如果一大群人都想你听他说话,那么你就给他们每人一分钟的时间说,大家轮流说,没说完的待会儿轮到时再继续说。也就是一个时间片的方法。

要实现异步I/O,我们可以通过使用框架asyncore/asynchat或Twisted,它们都是基于select函数或poll函数(poll只适于类Unix系统)的。select和poll函数都来自select模块。

select 函数要求三个必须序列作为参数和一个可选的以秒为单位的超时值。序列中是表示文件描述符的整数值,它们是我们要等待的连接。这三个序列是关于输入、输出和 异常条件的。如果超时值没有给出的话,select将处于阻塞状态(

也就是等待)直到有文件描述符准备动作。如果超时值给出了,那么select只阻塞给 定的时间。如果超时值是0的话,那么将不阻塞。select返回的值是一个由三个序列组成的元组,它们分别代表相应参数的活动的子集。例如,第一个序列

返 回的是用于读的输入文件描述符构成的序列。

序列可以包含文件对象(不适于Windows)或socket。下面这个例子创建一个使用 select去服务几个连接的服务器(注意:服务端的socket自身也提供给了select,以便于它能够在有新的连接准备接受时发出信号通知)。这个 服务器只是

简单地打印接受自客户端的数据。你可以使用telnet(或写一个基于socket的简单的客户端)来连接测试它。

select server

import socket, select

s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))

s.listen(5)
inputs = [s]
while True:
    rs, ws, es = select.select(inputs, [], [])
    for r in rs:
        if r is s:
            c, addr = s.accept()
            print 'Got connection from', addr
            inputs.append(c)
        else:
            try:
                data = r.recv(1024)
                disconnected = not data
            except socket.error:
                disconnected = True

            if disconnected:
                print r.getpeername(), 'disconnected'
                inputs.remove(r)
            else:
                print data

 

 

 

 


11   python是支持多线程的,并且是native的线程。主要是通过thread和threading这两个模块来实现的。 python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用。一般来说,

使用线程有两种模式,一种是创建线程要执行的函数,把这个函数传递进Thread对象里,让它来执行;另一种是直接从Thread继承,创建一个新的class,把线程执行的代码放到这个新的 class里。

 

12用Python可以做什么?可以做日常任务,比如自动备份你的MP3;可以做网站,很多著名的网站包括YouTube就是Python写的;可以做网络游戏的后台,很多在线游戏的后台都是Python开发的。总之就是能干很多很多事啦。

Python当然也有不能干的事情,比如写操作系统,这个只能用C语言写;写手机应用,只能用Objective-C(针对iPhone)和Java(针对Android);写3D游戏,最好用C或C++。

 


13 操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就

像所有任务都在同时执行一样。真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。

 


14.一种是启动多个进程,每个进程虽然只有一个线程,但多个进程可以一块执行多个任务。

    还有一种方法是启动一个进程,在一个进程内启动多个线程,这样,多个线程也可以一块执行多个任务。

    当然还有第三种方法,就是启动多个进程,每个进程再启动多个线程,这样同时执行的任务就更多了,当然这种模型更复杂,实际很少采用。
  
    线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。

    多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击