图片来源:elenabsl/Shutterstock


上一篇文章《基于Python3单进程+多线程+多协程的生产者-消费者模型示例代码》介绍了如何使用Python在单进程的情况下利用协程并发地处理数据,由于Python的GIL,所有代码只利用到了一个CPU核心,无法发挥多核心优势,所以我又做了一个多进程+多协程的模板,这里的代码不涉及具体业务。
代码地址:https://github.com/MacwinWin/multiprocessing_asyncio_data_processing

现状与挑战

以Cpython作为Python解释器时,由于GIL的存在导致:

  1. 多线程实际上始终在单核上进行运行,因而不适合进行计算密集型任务;而多线程之间可以共享数据,所以适合进行IO密集型任务;单线程间切换存在性能损耗,大规模并发并不适合多线程;
  2. 多进程能有效利用多核的计算优势,因而适合计算密集型任务;但由于Python的多进程是通过启动多个解释器实现的,之间存在数据隔离,因而不适合进行IO密集型任务;
  3. 协程是用户态的线程,用户可灵活操作其生命周期,且协程间切换及乎没有性能损耗,更适合大规模并发,但由于GIL限制,所以不适合进行计算密集型任务。

因而,使用Python进行实时大数据规模处理存在挑战。

总览

这里用到的库包括Python3自己的multiprocessing、threading、asyncio以及第三方库aioprocessing1

整体架构如下图所示:

详细说明

为了方便介绍代码逻辑,我将项目抽象成了现实世界中的装配工厂。
组织架构如下图所示:

#mermaid-svg-JluJgBduHkA1IWrT .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-JluJgBduHkA1IWrT .label text{fill:#333}#mermaid-svg-JluJgBduHkA1IWrT .node rect,#mermaid-svg-JluJgBduHkA1IWrT .node circle,#mermaid-svg-JluJgBduHkA1IWrT .node ellipse,#mermaid-svg-JluJgBduHkA1IWrT .node polygon,#mermaid-svg-JluJgBduHkA1IWrT .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-JluJgBduHkA1IWrT .node .label{text-align:center;fill:#333}#mermaid-svg-JluJgBduHkA1IWrT .node.clickable{cursor:pointer}#mermaid-svg-JluJgBduHkA1IWrT .arrowheadPath{fill:#333}#mermaid-svg-JluJgBduHkA1IWrT .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-JluJgBduHkA1IWrT .flowchart-link{stroke:#333;fill:none}#mermaid-svg-JluJgBduHkA1IWrT .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-JluJgBduHkA1IWrT .edgeLabel rect{opacity:0.9}#mermaid-svg-JluJgBduHkA1IWrT .edgeLabel span{color:#333}#mermaid-svg-JluJgBduHkA1IWrT .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-JluJgBduHkA1IWrT .cluster text{fill:#333}#mermaid-svg-JluJgBduHkA1IWrT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-JluJgBduHkA1IWrT .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-JluJgBduHkA1IWrT text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-JluJgBduHkA1IWrT .actor-line{stroke:grey}#mermaid-svg-JluJgBduHkA1IWrT .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-JluJgBduHkA1IWrT .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-JluJgBduHkA1IWrT #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-JluJgBduHkA1IWrT .sequenceNumber{fill:#fff}#mermaid-svg-JluJgBduHkA1IWrT #sequencenumber{fill:#333}#mermaid-svg-JluJgBduHkA1IWrT #crosshead path{fill:#333;stroke:#333}#mermaid-svg-JluJgBduHkA1IWrT .messageText{fill:#333;stroke:#333}#mermaid-svg-JluJgBduHkA1IWrT .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-JluJgBduHkA1IWrT .labelText,#mermaid-svg-JluJgBduHkA1IWrT .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-JluJgBduHkA1IWrT .loopText,#mermaid-svg-JluJgBduHkA1IWrT .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-JluJgBduHkA1IWrT .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-JluJgBduHkA1IWrT .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-JluJgBduHkA1IWrT .noteText,#mermaid-svg-JluJgBduHkA1IWrT .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-JluJgBduHkA1IWrT .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-JluJgBduHkA1IWrT .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-JluJgBduHkA1IWrT .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-JluJgBduHkA1IWrT .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JluJgBduHkA1IWrT .section{stroke:none;opacity:0.2}#mermaid-svg-JluJgBduHkA1IWrT .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-JluJgBduHkA1IWrT .section2{fill:#fff400}#mermaid-svg-JluJgBduHkA1IWrT .section1,#mermaid-svg-JluJgBduHkA1IWrT .section3{fill:#fff;opacity:0.2}#mermaid-svg-JluJgBduHkA1IWrT .sectionTitle0{fill:#333}#mermaid-svg-JluJgBduHkA1IWrT .sectionTitle1{fill:#333}#mermaid-svg-JluJgBduHkA1IWrT .sectionTitle2{fill:#333}#mermaid-svg-JluJgBduHkA1IWrT .sectionTitle3{fill:#333}#mermaid-svg-JluJgBduHkA1IWrT .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JluJgBduHkA1IWrT .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-JluJgBduHkA1IWrT .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JluJgBduHkA1IWrT .grid path{stroke-width:0}#mermaid-svg-JluJgBduHkA1IWrT .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-JluJgBduHkA1IWrT .task{stroke-width:2}#mermaid-svg-JluJgBduHkA1IWrT .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JluJgBduHkA1IWrT .taskText:not([font-size]){font-size:11px}#mermaid-svg-JluJgBduHkA1IWrT .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JluJgBduHkA1IWrT .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-JluJgBduHkA1IWrT .task.clickable{cursor:pointer}#mermaid-svg-JluJgBduHkA1IWrT .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-JluJgBduHkA1IWrT .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-JluJgBduHkA1IWrT .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-JluJgBduHkA1IWrT .taskText0,#mermaid-svg-JluJgBduHkA1IWrT .taskText1,#mermaid-svg-JluJgBduHkA1IWrT .taskText2,#mermaid-svg-JluJgBduHkA1IWrT .taskText3{fill:#fff}#mermaid-svg-JluJgBduHkA1IWrT .task0,#mermaid-svg-JluJgBduHkA1IWrT .task1,#mermaid-svg-JluJgBduHkA1IWrT .task2,#mermaid-svg-JluJgBduHkA1IWrT .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-JluJgBduHkA1IWrT .taskTextOutside0,#mermaid-svg-JluJgBduHkA1IWrT .taskTextOutside2{fill:#000}#mermaid-svg-JluJgBduHkA1IWrT .taskTextOutside1,#mermaid-svg-JluJgBduHkA1IWrT .taskTextOutside3{fill:#000}#mermaid-svg-JluJgBduHkA1IWrT .active0,#mermaid-svg-JluJgBduHkA1IWrT .active1,#mermaid-svg-JluJgBduHkA1IWrT .active2,#mermaid-svg-JluJgBduHkA1IWrT .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-JluJgBduHkA1IWrT .activeText0,#mermaid-svg-JluJgBduHkA1IWrT .activeText1,#mermaid-svg-JluJgBduHkA1IWrT .activeText2,#mermaid-svg-JluJgBduHkA1IWrT .activeText3{fill:#000 !important}#mermaid-svg-JluJgBduHkA1IWrT .done0,#mermaid-svg-JluJgBduHkA1IWrT .done1,#mermaid-svg-JluJgBduHkA1IWrT .done2,#mermaid-svg-JluJgBduHkA1IWrT .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-JluJgBduHkA1IWrT .doneText0,#mermaid-svg-JluJgBduHkA1IWrT .doneText1,#mermaid-svg-JluJgBduHkA1IWrT .doneText2,#mermaid-svg-JluJgBduHkA1IWrT .doneText3{fill:#000 !important}#mermaid-svg-JluJgBduHkA1IWrT .crit0,#mermaid-svg-JluJgBduHkA1IWrT .crit1,#mermaid-svg-JluJgBduHkA1IWrT .crit2,#mermaid-svg-JluJgBduHkA1IWrT .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-JluJgBduHkA1IWrT .activeCrit0,#mermaid-svg-JluJgBduHkA1IWrT .activeCrit1,#mermaid-svg-JluJgBduHkA1IWrT .activeCrit2,#mermaid-svg-JluJgBduHkA1IWrT .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-JluJgBduHkA1IWrT .doneCrit0,#mermaid-svg-JluJgBduHkA1IWrT .doneCrit1,#mermaid-svg-JluJgBduHkA1IWrT .doneCrit2,#mermaid-svg-JluJgBduHkA1IWrT .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-JluJgBduHkA1IWrT .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-JluJgBduHkA1IWrT .milestoneText{font-style:italic}#mermaid-svg-JluJgBduHkA1IWrT .doneCritText0,#mermaid-svg-JluJgBduHkA1IWrT .doneCritText1,#mermaid-svg-JluJgBduHkA1IWrT .doneCritText2,#mermaid-svg-JluJgBduHkA1IWrT .doneCritText3{fill:#000 !important}#mermaid-svg-JluJgBduHkA1IWrT .activeCritText0,#mermaid-svg-JluJgBduHkA1IWrT .activeCritText1,#mermaid-svg-JluJgBduHkA1IWrT .activeCritText2,#mermaid-svg-JluJgBduHkA1IWrT .activeCritText3{fill:#000 !important}#mermaid-svg-JluJgBduHkA1IWrT .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JluJgBduHkA1IWrT g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-JluJgBduHkA1IWrT g.classGroup text .title{font-weight:bolder}#mermaid-svg-JluJgBduHkA1IWrT g.clickable{cursor:pointer}#mermaid-svg-JluJgBduHkA1IWrT g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-JluJgBduHkA1IWrT g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-JluJgBduHkA1IWrT .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-JluJgBduHkA1IWrT .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-JluJgBduHkA1IWrT .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-JluJgBduHkA1IWrT .dashed-line{stroke-dasharray:3}#mermaid-svg-JluJgBduHkA1IWrT #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-JluJgBduHkA1IWrT #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-JluJgBduHkA1IWrT #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-JluJgBduHkA1IWrT #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-JluJgBduHkA1IWrT #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-JluJgBduHkA1IWrT #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-JluJgBduHkA1IWrT #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-JluJgBduHkA1IWrT #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-JluJgBduHkA1IWrT .commit-id,#mermaid-svg-JluJgBduHkA1IWrT .commit-msg,#mermaid-svg-JluJgBduHkA1IWrT .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JluJgBduHkA1IWrT .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JluJgBduHkA1IWrT .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JluJgBduHkA1IWrT g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JluJgBduHkA1IWrT g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-JluJgBduHkA1IWrT g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-JluJgBduHkA1IWrT g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-JluJgBduHkA1IWrT g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-JluJgBduHkA1IWrT g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-JluJgBduHkA1IWrT .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-JluJgBduHkA1IWrT .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-JluJgBduHkA1IWrT .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-JluJgBduHkA1IWrT .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-JluJgBduHkA1IWrT .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-JluJgBduHkA1IWrT .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-JluJgBduHkA1IWrT .edgeLabel text{fill:#333}#mermaid-svg-JluJgBduHkA1IWrT .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-JluJgBduHkA1IWrT .node circle.state-start{fill:black;stroke:black}#mermaid-svg-JluJgBduHkA1IWrT .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-JluJgBduHkA1IWrT #statediagram-barbEnd{fill:#9370db}#mermaid-svg-JluJgBduHkA1IWrT .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-JluJgBduHkA1IWrT .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-JluJgBduHkA1IWrT .statediagram-state .divider{stroke:#9370db}#mermaid-svg-JluJgBduHkA1IWrT .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-JluJgBduHkA1IWrT .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-JluJgBduHkA1IWrT .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-JluJgBduHkA1IWrT .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-JluJgBduHkA1IWrT .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-JluJgBduHkA1IWrT .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-JluJgBduHkA1IWrT .note-edge{stroke-dasharray:5}#mermaid-svg-JluJgBduHkA1IWrT .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-JluJgBduHkA1IWrT .error-icon{fill:#522}#mermaid-svg-JluJgBduHkA1IWrT .error-text{fill:#522;stroke:#522}#mermaid-svg-JluJgBduHkA1IWrT .edge-thickness-normal{stroke-width:2px}#mermaid-svg-JluJgBduHkA1IWrT .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-JluJgBduHkA1IWrT .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-JluJgBduHkA1IWrT .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-JluJgBduHkA1IWrT .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-JluJgBduHkA1IWrT .marker{fill:#333}#mermaid-svg-JluJgBduHkA1IWrT .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-JluJgBduHkA1IWrT {color: rgba(0, 0, 0, 0.75);font: ;}

CEO
采购部
生产部
运输部
运维部
采购员
0车间
1车间
...
n车间
车间主任
主任助理
副主任
工人
监工
调度员
搬运工
司机
运维员

其中四部门为单独的进程,采购员、车间主任、调度员、运维员、副车间主任为线程,主任助理、工人、监工、搬运工、司机为协程。
各部门、岗位职责:

  • CEO:

    1. 根据公司资源合理分配给各部门,尤其是产品部,更多的车间意味着更大的产量,但也会消耗更多的资源(CPU 核心);
    2. 创建车间,为车间分配生产所需的资源;为每一个车间创建一条生产流水线(线程安全的同步队列);创建一条各车间共享的运输传送带(线程安全的异步队列)
    3. 管理四部门的正常运作
  • 采购部:
    • 采购员(一名):

      1. 购买原材料,并为原材料贴上所属的产品ID标签(一条生产流水线负责多个产品,一个产品可能由多种原材料组成)
      2. 将原材料放在对应的生产流水线上
  • 生产部:
    • 0车间:

      • 车间主任(一名):

        1. 管理主任助理和副主任;
        2. 从生产流水线上取出原材料,根据上面的产品ID标签,在员工花名册上找到所属的员工,与该员工重新续签合同,并登记后交给副主任;
        3. 如果在员工花名册上没有找到所属员工则新招聘一名工人,并与其签订合同;
          (关于合同机制2
        • 副主任(一名):

          1. 占有车间一半资源以供其安排生产;
          2. 从主任处获得原材料,放置在对应工人的传送带上;
          3. 仅将资源分配给手中有原材料的工人;
          • 工人(n名):

            1. 每名工人配有一条传送带,工人从传送带上获取原材料;
            2. 根据产品装配图,对原材料进行处理;
            3. 完成后给产品贴上产品类标签,然后放入运输传送带上;
            4. 每名工人受合同约束;
          • 监工(n名):
            1. 监工属于公司编制内,没有合同约束,每名监工定时监督一名工人;
        • 主任助理(一名):
          1. 接受主任的管理,对主任负责;
          2. 定时检查员工花名册
    • 1车间
    • n车间
  • 运输部:
    • 调度员(一名):

      1. 管理搬运工和司机;
      2. 管理仓库;
      • 搬运工(一名):

        1. 从运输传送带上获取产品;
        2. 对产品做一些处理,例如包装;
        3. 将产品根据产品类型放在仓库中;
      • 司机(一名):
        1. 每隔一段时间清空仓库中的产品
  • 运维部:
    • 运维员(一名):

      1. 每隔一段时间巡检一遍生产流水线

使用方式

# build image
>>> docker build -t test:1.0
# run the image as a container
>>> docker run -i -t -d -v $(pwd):/app --name test test:1.0
>>> docker exec -i -t test /bin/bash
>>> python3 ceo.py

测试

在我的MacBook Pro 16, i7 2.6上测试,Docker分配8核8G内存,结果如下图。
可以看到每秒“采购”5000+原材料,在生产流水线上无积压,说明都消耗完,员工花名册总数稳定在5000左右,内存消耗也保持稳定。

但如果在‘采购’时不加限制(无延迟)则会导致原材料数量远超实际产能,原材料大量积压在生产流水线上,严重降低生产流水线性能,车间无法获得足够原材料,导致公司产能大幅下降。

所以最佳方案是根据资源数量(CPU核数)确定车间数量,再合理设置采购速度,使得原材料采购速度与实际产能匹配,生产流水线上不产生积压现象。

结论

通过结合使用Python多进程、多线程、协程的方式,实现了单机4核CPU8G内存下约5000条/s的数据处理速度。如果想实现更大规模的数据处理,可通过增加CPU核数内存数。

计划

  1. 持续优化代码,提高速度
  2. 添加类型提示(type hints)

  1. 项目中使用aioprocessing主要是用它的进程间异步队列,该队列汇集各进程的输出结果,但由于整体是由Python实现的,队列性能较差,可考虑替换之。 ↩︎

  2. 合同机制:
    该机制保证了工人在一段时间后仍然没有获得新原材料的情况下,判定为订单取消,解雇该名工人,以保证不会存在过多“划水”员工 ↩︎

基于Python3多进程(多线程)+多协程的数据并发处理模版相关推荐

  1. python3多进程 进程池 协程并发

    一.进程 我们电脑的应用程序,都是进程,进程是资源分配的单位.进程切换需要的资源最大,效率低. 进程之间相互独立 cpu密集的时候适合用多进程 #多进程并发 import multiprocessin ...

  2. 什么是多进程-多线程-多协程 ----进程和多进程

    进程和多进程 进程和多进程 进程 概念: 组成: 基本状态: 创建: 如何创建子进程? OS.fork 创建子进程 返回值 os.getpid():获取进程的进程号 os.getppid():获取父进 ...

  3. 什么是多进程-多线程-多协程 ----进程和多线程

    进程和多线程 进程通信 进程的组成 进程之间的通信方式 管道 匿名管道 命名管道 信号 信号量 共享内存 socket 消息队列 进程线程 系统知识 cpu时间片(抽象概念) 线程: 进程: 进程与线 ...

  4. gunicorn多进程不死_WEB,gunicorn - 无论是多进程、多线程、协程模式,同一个浏览器窗口多个标签页访问同一个url,看上去不会并发的问题...

    TL;DR 其实是浏览器同一个窗口下限制了对同一个url会执行串行操作. 1.参考 2.现象 我有一个WSGI APP,每次处理request都睡眠5秒.不管多进程.多线程.协程跑WSGI APP,同 ...

  5. php协程 多线程,【swoole.2.01】多进程,多线程和协程

    前言 在体验swoole的协程功能之前,需要先知道多进程,多线程和协程的区别. 多进程 典型的多进程结构就是耳熟能详的master-worker结构.swoole本身也是由master-maneger ...

  6. python多线程好还是多协程好_深入浅析python中的多进程、多线程、协程

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

  7. Python3多线程与协程测试

    今天简单测试了下python中的多线程与协程,之前在看python的教程中有说到python的多线程其实是在一个线程中来回切换并不会真正的去使用多核资源.如果想真正去利用多核资源,最好的办法是使用py ...

  8. 【2021最新版】Python 并发编程实战,用多线程、多进程、多协程加速程序运行

    [2021最新版]Python 并发编程实战,用多线程.多进程.多协程加速程序运行 视频地址:https://www.bilibili.com/video/BV1bK411A7tV/ P1 Pytho ...

  9. python 多线程和协程结合_一文讲透 “进程、线程、协程”

    本文从操作系统原理出发结合代码实践讲解了以下内容: 什么是进程,线程和协程? 它们之间的关系是什么? 为什么说Python中的多线程是伪多线程? 不同的应用场景该如何选择技术方案? ... 什么是进程 ...

最新文章

  1. 如何解决在数据显示的时候,页面出现null的情况
  2. 史上最全GAN综述2020版:算法、理论及应用
  3. linux 进程的作用,linux的几个进程的作用
  4. C语言经典例67-数组最大值与最小值与数组元素交换
  5. Python列表对象的sort()方法排序
  6. 使用athens部署企业内部Gitlab go mod包的Go私服代理
  7. 一个有意思的CStatic和combobox以及Cedit控件结合使用
  8. C语言过时了?你在做梦?
  9. 程序员的奋斗史(二)——今天你跑步了吗
  10. (25)Vue.js组件通信—父组件向子组件传值
  11. 光子不维护服务器,光子云和光子服务器
  12. Java实现Zip文件解压到指定目录
  13. IDEA 自动导入的配置(Auto import)
  14. wsl2 ping不通windows主机问题速查
  15. 显示桌面的图标不见了 怎么显示出来
  16. 以太坊 权益证明(五)
  17. Db2应用状态为uow waiting,但快照显示却在不停地Fetch
  18. Python XML解析方法
  19. VMware 安装 黑苹果 镜像下载地址 体验一下OS
  20. uni-app 字体文件引入,小程序不支持问题解决

热门文章

  1. 论文阅读四:基于流分类的数据中心网络负载均衡机制
  2. CSDN 5月付费专栏销量榜Top10
  3. 物联网如何帮助企业实现环境、社会和治理目标
  4. git detached head解决方法
  5. 混凝土及水泥制品市场预测
  6. nvm 的安装安装 node 以及 nvm 操作命令 yarn 的安装
  7. itoa函数 atoi函数
  8. html网页制作.css属性,网页设计中的CSS样式
  9. 湖南大学21夏训练四13.7,还是7
  10. 蓝桥杯2015年省级六、七题解