expt.是什么敬词的意思及其用法用法

Python中asyncore异步模块的用法及实现httpclient的实例
转载 & & 作者:cangmean
asyncore即是一个异步的socket封装,特别是dispatcher类中包含了很多异步调用的socket操作方法,非常犀利,下面我们就来讲解Python中asyncore异步模块的用法及实现httpclient的实例
这个模块是socket的异步实现,让我们先来熟悉一下模块中的一些类和方法:
1.asyncore.loop
输入一个轮询循环直到通过计数或打开的通道已关闭。
2.asyncore.dispatcher
dispatcher类是一个底层socket类的包装对象。要使它更有用, 它有一部分事件处理方法被异步循环调用。否则它就是一个标准的非阻塞socket对象。
底层的事件在特定事件或特定的连接状态告诉异步循环,某些高级事件发生了。例如, 我们要求一个socket连接到另一个主机。
(1)handle_connect() 第一次读或写事件。
(2)handle_close() 读事件没有数据可用。
(3)handle_accept 读事件监听一个socket。
(4)handle_read
在异步循环察觉到通道呼叫read()时调用。
(5)handle_write
在异步循环检测到一个可写的socket可以写的时候调用。这种方法经常实现缓冲性能。比如
def handle_write(self):
sent = self.send(self.buffer)
self.buffer = self.buffer[sent:]
(6)handle_expt
当有(OOB)数据套接字连接。这几乎永远不会发生,因为OOB精细地支持和很少使用。
(7)handle_connect
当socket创建一个连接时调用。
(8)handle_close
当socket连接关闭时调用。
(9)handle_error
当引发一个异常并没有其他处理时调用。
(10)handle_accept
当本地监听通道与远程端建立连接(被动连接)时调用。
(11)readable
每次在异步循环确定是否添加一个通道socket到读事件列表时调用,默认都为True。
(12)writable
每次在异步循环确定是否添加一个通道socket到写事件列表时调用, 默认为True。
(13)create_socket
与创建标准socket的时候相同。
(14)connect
与标准socket的端口设置是相同, 接受一个元组第一个参数为主机地址,第二个参数是端口号。
(15)send
向远程端socket发送数据。
(16)recv
从远程端socket读取最多buffer_size的数据。一个空的字符串意味着从另一端通道已关闭。
(17)listen
监听socket连接。
(18)bind
将socket绑定到地址。
(19)accept
接受一个连接, 必须绑定到一个socket和监听地址。
(20)close
关闭socket。
3.asyncore.dispatcher_with_send
dispatcher子类添加了简单的缓冲输出功能用于简单的客户,更复杂的使用asynchat.async_chat。
4.asyncore.file_dispatcher
file_dispatcher需要一个文件描述符或文件对象地图以及一个可选的参数,包装,使用调查()或循环()函数。如果提供一个文件对象或任何fileno()方法,该方法将调用和传递到file_wrapper构造函数。可用性:UNIX。
5.asyncore.file_wrapper
file_wrapper需要一个整数文件描述符并调用os.dup()复制处理,这样原来的处理可能是独立于file_wrapper关闭。这个类实现足够的方法来模拟一个套接字使用file_dispatcher类。可用性:UNIX。
asyncore 实例
1.一个http client的实现。
import socket
import asyncore
class Client(asyncore.dispatcher):
def __init__(self, host, path):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect((host, 80))
self.buffer = 'GET %s HTTP/1.0\r\n\r\n' % path
def handle_connect(self):
def handle_close(self):
self.close()
def handle_read(self):
print self.recv(8192)
def writable(self):
return (len(self.buffer) & 0)
def handle_write(self):
sent = self.send(self.buffer)
self.buffer = self.buffer[sent:]
client = Client('www.python.org', '/')
asyncore.loop()
服务器接受连接和分配任务
import socket
import asyncore
class EchoHandler(asyncore.dispatcher_with_send):
def handle_read(self):
data = self.recv(8192)
self.send(data)
class EchoServer(asyncore.dispatcher):
def __init__(self, host, port):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_add()
self.bind((host, port))
self.listen(5)
def handle_accept(self):
pair = self.accept()
if pair is not None:
sock, addr = pair
print 'Incoming connection from %s' % repr(addr)
handler = EchoHandler(sock)
server = EchoServer('localhost', 8080)
asyncore.loop()
2.利用asyncore的端口映射(端口转发)
import socket,asyncore
class forwarder(asyncore.dispatcher):
def __init__(self, ip, port, remoteip,remoteport,backlog=5):
asyncore.dispatcher.__init__(self)
self.remoteip=remoteip
self.remoteport=remoteport
self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
self.set_reuse_addr()
self.bind((ip,port))
self.listen(backlog)
def handle_accept(self):
conn, addr = self.accept()
# print '--- Connect --- '
sender(receiver(conn),self.remoteip,self.remoteport)
class receiver(asyncore.dispatcher):
def __init__(self,conn):
asyncore.dispatcher.__init__(self,conn)
self.from_remote_buffer=''
self.to_remote_buffer=''
self.sender=None
def handle_connect(self):
def handle_read(self):
read = self.recv(4096)
# print '%04i --&'%len(read)
self.from_remote_buffer += read
def writable(self):
return (len(self.to_remote_buffer) & 0)
def handle_write(self):
sent = self.send(self.to_remote_buffer)
# print '%04i &--'%sent
self.to_remote_buffer = self.to_remote_buffer[sent:]
def handle_close(self):
self.close()
if self.sender:
self.sender.close()
class sender(asyncore.dispatcher):
def __init__(self, receiver, remoteaddr,remoteport):
asyncore.dispatcher.__init__(self)
self.receiver=receiver
receiver.sender=self
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect((remoteaddr, remoteport))
def handle_connect(self):
def handle_read(self):
read = self.recv(4096)
# print '&-- %04i'%len(read)
self.receiver.to_remote_buffer += read
def writable(self):
return (len(self.receiver.from_remote_buffer) & 0)
def handle_write(self):
sent = self.send(self.receiver.from_remote_buffer)
# print '--& %04i'%sent
self.receiver.from_remote_buffer = self.receiver.from_remote_buffer[sent:]
def handle_close(self):
self.close()
self.receiver.close()
if __name__=='__main__':
import optparse
parser = optparse.OptionParser()
parser.add_option(
'-l','--local-ip',
dest='local_ip',default='127.0.0.1',
help='Local IP address to bind to')
parser.add_option(
'-p','--local-port',
type='int',dest='local_port',default=80,
help='Local port to bind to')
parser.add_option(
'-r','--remote-ip',dest='remote_ip',
help='Local IP address to bind to')
parser.add_option(
'-P','--remote-port',
type='int',dest='remote_port',default=80,
help='Remote port to bind to')
options, args = parser.parse_args()
forwarder(options.local_ip,options.local_port,options.remote_ip,options.remote_port)
asyncore.loop()
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具ORACLE的sqlplus脚本sqlldr处理
&&&&&&&&&&&&&&&&&&&&&&&&&&&ORACLE的sqlplus脚本与数据sqlldr处理
程序中将数据装在到数据库中的方式一般分为2大类,第一大类是程序中分析出来的数据需要存入数据库。
第二大类是外在数据需要导入到数据库。正对这2大类的我们有不相应的处理办法。
对于第一大类程序中分析出来的数据需要存储到数据库这种情况有2种方式处理:1,使用简单的sql语句追条插入数据库中或使用容器将数据存储之后,循环存入数据库中,
2,将分析的数据写入文件之后,使用sqlldr命令按照控制文件的方式导入数据库中。
对于第二大类外在数据的存储也分为2类:1,使用oracle提供的sqlplus,spool,prompt,expt等命令组成脚本的方式处理。
2,是使用pl/sql工具提供的方法进行处理。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
对于第二大类的数据处理方法讲解
一,使用pl/sql工具提供的方法进行处理:&&&&&&&&&
(1)安装好数据库客户端之后配置好PLSQL Developer工具,使用PLSQL
Developer工具的tools选项中的import table就可以导入表结构,
当然可以在sql窗口执行sql语句。
(2),就是对已经建立好的数据库和表结构进行导入,同样使用PLSQL
Developer工具的tools选项的“导出用户对象”或者export table导出结构。
(3),同上进行批量的导入数据,使用PLSQL
Developer工具的tools选项的“导出/导入表”就可以导入或者取出数据库中的数据了。
(4)下面的等待测试:
用PL/SQL DEVELOPER 怎样导出表结构:tools-&export tables
是导出表结构,还有数据tools-&export user
objects是导出表结构可以用tools-&export tables用中间的sql
inserts页面,
选中create tables选项,where clause 里写入 where
二,使用oracle中sqlplus可以使用的命令spool,prompt,expt等
我们在使用sqlplus命令执行脚本的时候一般需要使用到很多关键字命令,脚本主要就是使用这些组建成的。
组建1,prompt作用是用来输出信息,类似于linux中的echo 命令。例子:prompt
===================
组建2,tarfile 压缩目录及妻子目录。例子:tarfile ${file}将下面的文件压缩。
组建3,fuser 命令列出了使用该设备上任何文件的进程。例子: fuser ${file}
c 将此文件作为当前目录使用。
e 将此文件作为程序的可执行对象使用。
r 将此文件作为根目录使用。
s 将此文件作为共享库(或其它可装载对象)使用。
组建4,set 关键字结合其他组件
&&& set head
&&& set pagesize
&&& set linesize
&&& set echo
on:显示文件中的每条命令及其执行结果;
&&& set echo
off:不显示文件中的命令,只显示其执行结果。
&set serveroutput on
//SEVEROUTPUT用于控制是否显示存储过程的输出,默认为OFF
&SQL& set long 999999
&SQL& set feedback off
组建5,term ,time,echo, define
&set term on:查询结果既显示于假脱机文件中,又在SQLPLUS中显示;
&&& set term
off:查询结果仅仅显示于假脱机文件中
&&& set define
则关闭该功能,“&”将作为普通字符,如上例,最终字符就为“SQL&Plus”
&&& set define
off关闭替代变量功能
&set define on 开启替代变量功能
&&& Set echo
on/off:打开/关闭命令的回显,默认为ON。
&&& Set time
on/off:打开/关闭时间显示,默认为OFF
linesize pagesize
&组建6,spool命令 有很多的作用和选项,spool
temp.sql就可以执行sql语句的文件&
//下面的spool 命令加文件路径名文件,在执行操作之后使用spool off 命令关闭之后会将spool 开始到spool off
之间的所有信息记录
在指定的文件中,查询结果仅仅存在于假脱机文件中。
SQL& spool
/home/qinjiachang/sd_css/src/pay/sock_test/yk/3.txt
@/home/qinjiachang/sd_css/src/pay/sock_test/yk/2.sql
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
SQL& spool off
[qinjc@linux203 yk]$ cat 3.txt
SQL& select distinct(region) from OM_MPAY_USER_INFO
where region is not
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0757&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0754&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
SQL&@/home/qinjiachang/sd_css/src/pay/sock_test/yk/2.sql&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
SQL& SPOOL OFF
组建7:EXECUTE(或者EXEC)命令,可以执行单条PL/SQL语句,不需要从缓冲区或脚本文件中执行
脚本例子:
&sqlplus -s
$database &&EOFa
insert_noc_user();
&三,可以在shell中使用sqlplus结合sqlldr命令一起操作数据库。1,例子:
sqlldr ${dblink}\
&&&&&&&&&&&&&&&
control=${ctlpath}qfcj.ctl\&
其中\是序行符,表示后面的命令字符串本来都是一行的
&&&&&&&&&&&&&&&
log=${logpath}${list}.log\
&&&&&&&&&&&&&&&
bad=${badpath}${list}.bad\
&&&&&&&&&&&&&&&
data=${listpath}${list}\
&&&&&&&&&&&&&&&
direct=faulse errors=100000 readsize=
rm -f ${list}
sqlplus -s ${dblink} && EOFa
insert into push_v4_mon select b.user_id,lower(a.user_name) from
push_v4_mon_tmp a,push_v4_userinfo b where
a.user_name=b.user_
insert into push_v4_userrelation select
user_id,user_name,${groupid1} from push_v4_
2,可以再shell脚本中的BEGIN与end关键字与sqlplus结合使用
函数的例子:
sqlplus -s ${dbcfg} && EOFa | tee -a
./count_log.txt
INSERT INTO table_name& VALUES(
$1,'$2','$webpath$3',0,sysdate);
&四,sqlplus命令的使用。概述,sqlplus命令是连接shell或者程序与数据库之间的桥梁,是一种交互式方式,是oracle自带工具,sqlplus命令提供交互式连接之后同时
可以使用很多的组件,例如set
,spool,time等等共同完成脚本,同时sqlplus还支持手动操作导入数据,导出数据,执行文件等功能。
sqlplus模式是一个大的范围,某些命令或者关键字是oracle环境变量决定的。
(1)sqlplus -s 中的-s表示关闭系统交互的提示信息。
登陆实力方式: sqlplus 用户名/密码@实例名
  1. 执行一个SQL脚本文件
  SQL&start file_name
  SQL&@ file_name
  我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理。
  2. 对当前的输入进行编辑
  SQL&edit
  3. 重新运行上一次运行的sql语句
  4. 将显示的内容输出到指定文件
  SQL& SPOOL file_name
  在屏幕上的所有内容都包含在该文件中,包括你输入的sql语句。
  5. 关闭spool输出
  SQL& SPOOL OFF
  只有关闭spool输出,才会在输出文件中看到输出的内容。
  6.显示一个表的结构
  SQL& desc table_name
  7. COL命令:
  主要格式化列的显示形式。
  该命令有许多选项,具体如下:
  COL[UMN] [{ column|expr} [ option ...]]
  Option选项可以是如下的子句:
  ALI[AS] alias
  CLE[AR]
  FOLD_A[FTER]
  FOLD_B[EFORE]
  FOR[MAT] format
  HEA[DING] text
  JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
  LIKE { expr|alias}
  NEWL[INE]
  NEW_V[ALUE] variable
  NOPRI[NT]|PRI[NT]
  NUL[L] text
  OLD_V[ALUE] variable
  ON|OFF
  WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
/path/insertdata.sql&
SQL&@/path/insertdata.sql&&
这2条都可以在数据库中执行sql语句的脚本,脚本中都是sql语句
SQL&@@insertdata.sql&&
//不指定sql标本的路径,默认情况下是在oracle的当前路径下执行的
对当前的输入进行编辑&&
不知道编辑的是不是sql语句的脚本文件
//重新显示上一次运行的sql语句的信息,而不是执行一次sql脚本文件
&&&&&&&&&&&&&&&&&&&&&&&&&sqlplus操作数据库脚本举例
yday=`perl -e
'($a,$b,$c,$day,$mon,$year,$d,$e,$f) =
localtime(time-86400*2);printf
"Mdd",$year+1900,$mon+1,$day'`
ret=`sqlplus -s ${dblink} &&EOF
//域的分割标志
set heading
//不显示查询结果的标题字段
set feedback off&&
//不显示查询结构的尾部统计字段
select distinct(region) from OM_MPAY_USER_INFO where region is not
& //断开连接但是不退出sqlplus界面
& //退出sqlplus界面
EOF`& //表示遇到这个EOF就结束在sqlplus中输入内容
oraerr=`echo ${ret} | grep ERROR`
if [ "A"${oraerr} != "A" ]&
//蓝色部分为自定义的判断错误标志标签
echo "get region error!!!"
echo "get region ok"
echo "ret=${ret}"
#循环处理区号
for region in ${ret}
echo ${region}
ret1=`sqlplus -s ${dblink}
&&&&&&&&&&&&&&&
set heading off
&&&&&&&&&&&&&&&
set feedback off
&&&&&&&&&&&&&&&
select& B.paycode || '|' ||B.payplattype|| '|'
||B. msisdn|| '|' ||to_char(B.paytime,'YYYY-MM-DD HH24:MI:SS')||
B.payamount || '|' ||B.Paychannel||
'|'&&& from
OM_MPAY_USER_INFO A , OM_MPAY B
WHERE& A.msisdn = B.msisdn and A.region=
${region}& and B.pay_date = ${yday};
&&&&&&&&&&&&&&&
# 符号|| 表示将字段结果拼在一起输出
oraerr=`echo ${ret1} | grep ERROR`
if [ "A"${oraerr} != "A" ];then
&&&&&&&&&&&&&&&
echo "get region error!!!"
&&&&&&&&&&&&&
echo "&& ok"
echo "ret1=${ret1}"
echo -n ${ret1} | awk -F'|' 'BEGIN{ncount=0;nsum=0;}
{ncount=ncount+1;nsum=nsum+$5;} END{print
yday"|"ncount"|"nsum"|"}'yday=${yday}
|1|| 10:09:43|50|2|
|1|| 10:09:43|50|2|
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 expt 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信