资讯专栏INFORMATION COLUMN

【tulip】 - 多进程的版本

ACb0y / 2953人阅读

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

前面的网络编程的例子使用多进程也是可以实现的:

import socket
import os

def main():
    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()
        pid = os.fork()
        if pid == 0: # I am child process
            serve(conn_sock, client_addr)
        else: # I am parent process
            conn_sock.close()

def serve(conn_sock, client_addr):
    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()

main()

其中os.fork()之后会创建一个子进程。子进程默认会继承所有父进程的所有file descriptor(也就包括打开的socket),已经拥有fork前父进程的所有内存状态。所以子进程可以拿着父进程打开的conn_sock继续与客户端通信。而父进程在把conn_sock交给子进程之后,就不再需要开着这个socket的fd了,所以就需要关闭掉。否则,子进程调用conn_sock.close()之后,客户端的连接其实还没有断开,因为父进程还拿着fd不放呢。
从调度的角度来看,前面说的两个要素:

状态的保存:仍然是保存在栈上。每个进程都有一个主线程。fork出来的子进程的主线程的栈上保存了对应客户端的conn_sock。

不同socket之间的调度:仍然是利用内核的scheduler,只是这次调度的是process。对于内核来说调度逻辑是差不多的,区别就是process还要额外更新一下虚拟内存的映射表,使得多个process彼此之间不可见对方的内存。

从效率上来说,具有多线程一样的问题,而且内存占用会更高,切换成本也更高。多线程和多进程的版本从代码可读性上来说还是非常不错的,很好懂,从上至下平铺直叙的。

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

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

相关文章

  • tulip】 - 线程版本

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

    CoderStudy 评论0 收藏0
  • tulip】 - I/O阻塞小例子

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

    JessYanCoding 评论0 收藏0
  • tulip】 - IOCP

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

    Sunxb 评论0 收藏0
  • Python 开发者在迁移到 Go(lang) 时需要知道哪些事?

    摘要:如果你只对开发者需要了解的事感兴趣,请下拉到早该知道的事板块。在不泄露机密的情况下,利用支持向量机来获取一个句子最可能的意思,并且以此来推断句子的情感。也就是说,如果一个文档包含个词,就会与支持向量机进行多次对比。 【编者按】本文最早由 Repustate 发布,主要介绍将代码迁移至 Go(lang) 时的注意事项。文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文。 ...

    hqman 评论0 收藏0
  • 【generator101】 - yield from

    摘要:我们可以看一下的可见是由内部支持的,其实现原理上就避免了栈进栈出的消耗,直接由最内层的返回值。另外可以实现外部直接向最内层的传递值,比如这段代码的输出是这样传值的方式,在用循环重新的模式下是无法实现的。这也就是必须使用,而不能使用的原因。 在python 3.3里,generator新增了一个语法 yield from 这个yield from的作用是什么?看下面两段对比的代码: d...

    xiaodao 评论0 收藏0

发表评论

0条评论

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