资讯专栏INFORMATION COLUMN

【tulip】 - I/O阻塞的小例子

JessYanCoding / 2590人阅读

摘要:在了解了的实现方式的基础之上,希望能够把流程阻塞的功能在的框架之上实现,从而可以制作一个简单的类似,这样的集群调度工具。我们先来看一个最基本的网络编程的例子这是一个服务器。

接下来,会把Python tulip这个网络库(也就是3.4之后的asyncio)如何实现的进行一些分析。在了解了tulip的实现方式的基础之上,希望能够把流程阻塞的功能在tulip的框架之上实现,从而可以制作一个简单的类似ansible,saltstack这样的集群调度工具。
我们先来看一个最基本的网络编程的例子

import socket

listen_sock = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=socket.IPPROTO_IP)
listen_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_sock.bind(("0.0.0.0", 9090))
listen_sock.listen(0)
while True:
    conn_sock, client_addr = listen_sock.accept()
    print("connected from %s:%s" % client_addr)
    input = conn_sock.recv(8192)
    while "done" != input.strip():
        conn_sock.sendall(input)
        input = conn_sock.recv(8192)
    conn_sock.sendall("bye!
")
    conn_sock.close()

这是一个tcp服务器。客户端连上了之后向其发送的字符会被原样返回回来(所谓echo),除非发送的是done这个字符串。收到了done之后连接断开这个客户端的连接。

$ telnet 127.0.0.1 9090
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is "^]".
I say hello
I say hello
done
bye!

这个例子没有使用多线程,也没有使用其他任何支持并发的技术。所以一次也就只能有一个客户端连到服务器进行通信,第二个客户端连上来之后得等一个客户端退出之后才会被服务器服务。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45306.html

相关文章

  • tulip】 - IOCP

    摘要:简单来说就是一个操作系统提供的回调机制。其中这一步是创建,是做一个调用,后面的是轮询,这一步是根据返回的查找对应的回调函数回调。这样状态从多个线程的多个栈上,变成了只有一个线程,但是在线程内部有一个来维护单线程内多个并发流程的状态。 为了让I/O阻塞的时候,程序还可以去干别的。除了使用线程模型,让操作系统的内核去调度多个线程,Windows提供了IOCP机制。简单来说就是一个操作系统提...

    Sunxb 评论0 收藏0
  • tulip】 - 多线程的版本

    摘要:最重要的是每个线程,对应了一个函数的执行。有多个线程同时执行的时候,每个线程的状态是由操作系统内核负责保存在内存中的。在多线程的实现中。并且内核的线程在切换多个线程的时候,线程切换的开销是比较大。 上次的网络编程的例子,改写成多线程的是这样: import socket import thread def main(): listen_sock = socket.socke...

    CoderStudy 评论0 收藏0
  • tulip】 - 多进程的版本

    摘要:前面的网络编程的例子使用多进程也是可以实现的其中之后会创建一个子进程。从效率上来说,具有多线程一样的问题,而且内存占用会更高,切换成本也更高。多线程和多进程的版本从代码可读性上来说还是非常不错的,很好懂,从上至下平铺直叙的。 前面的网络编程的例子使用多进程也是可以实现的: import socket import os def main(): listen_sock = s...

    ACb0y 评论0 收藏0
  • python并发2:使用asyncio处理并发

    摘要:是之后引入的标准库的,这个包使用事件循环驱动的协程实现并发。没有能从外部终止线程,因为线程随时可能被中断。上一篇并发使用处理并发我们介绍过的,在中,只是调度执行某物的结果。 asyncio asyncio 是Python3.4 之后引入的标准库的,这个包使用事件循环驱动的协程实现并发。asyncio 包在引入标准库之前代号 Tulip(郁金香),所以在网上搜索资料时,会经常看到这种花的...

    wushuiyong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<