Mitogen рд╕рд╣ рдЙрддреНрддрд░рджрд╛рдпреА рдЧрддреА рд╡рд╛рдврд╡рдгреЗ

рдЙрддреНрддрд░ рджреНрдпрд╛ рд╕рд░реНрд╡рд╛рдд рд▓реЛрдХрдкреНрд░рд┐рдп рдмрдирд▓реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди. рдирдВрддрд░ Red Hat рдиреЗ рдЦрд░реЗрджреА рдХреЗрд▓реЗ рд╣реЛрддреЗ 2015 рдордзреНрдпреЗ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдХрд▓реНрдк рд╕рд╣рднрд╛рдЧреА рд╣рдЬрд╛рд░реЛ рдУрд▓рд╛рдВрдбрд▓реЗ рдЖрдгрд┐ Ansible рдХрджрд╛рдЪрд┐рдд рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд рд╡рд╛рдкрд░рд▓реЗрд▓реА рддреИрдирд╛рддреА рдЖрдгрд┐ рдСрд░реНрдХреЗрд╕реНрдЯреНрд░реЗрд╢рди рдкреНрд░рдгрд╛рд▓реА рдмрдирд▓реА. рддреНрдпрд╛рдЪреНрдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдЪреА рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реЗрдгреА рдЦреВрдк рдкреНрд░рднрд╛рд╡реА рдЖрд╣реЗ.

рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯрд╡рд░ SSH рдХрдиреЗрдХреНрд╢рдирд╡рд░ рдЙрддреНрддрд░рджрд╛рдпреА рдХрд╛рд░реНрдп рдХрд░рддреЗ. рд╣реЗ рдПрдХ SSH рд╕рддреНрд░ рдЙрдШрдбрддреЗ, рд▓реЙрдЧ рдЗрди рдХрд░рддреЗ, рдкрд╛рдпрдерди рдХреЛрдб рдиреЗрдЯрд╡рд░реНрдХрд╡рд░ рдХреЙрдкреА рдХрд░рддреЗ рдЖрдгрд┐ рд╡реЗрдЧрд│реНрдпрд╛ рддрд╛рддреНрдкреБрд░рддреНрдпрд╛ рдлрд╛рдЗрд▓рд╡рд░ рд▓рд┐рд╣рд┐рддреЗ. рддреНрдпрд╛рдирдВрддрд░, рддреА рд╣реА рдлрд╛рдЗрд▓ рд░рд┐рдореЛрдЯ рдорд╢реАрдирд╡рд░ рдЪрд╛рд▓рд╡рддреЗ. рдСрдкрд░реЗрд╢рдиреНрд╕рдЪрд╛ рд╣рд╛ рд╕рдВрдкреВрд░реНрдг рдХреНрд░рдо рдмрд░рд╛рдЪ рд▓рд╛рдВрдм рдЖрдгрд┐ рдХрдВрдЯрд╛рд│рд╡рд╛рдгрд╛ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рддреЗ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЭ рдХрд░рдгреНрдпрд╛рдЪреЗ рд╡рд┐рд╡рд┐рдз рдорд╛рд░реНрдЧ рдЖрд╣реЗрдд.

рдпрд╛рдкреИрдХреА рдПрдХ рдорд╛рд░реНрдЧ рдЖрд╣реЗ SSH рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдирд╡реАрди рд╕рддреНрд░ рдЙрдШрдбрдгреНрдпрд╛рдРрд╡рдЬреА рд╕реВрдЪрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ SSH рд╕рддреНрд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ, рдЬреНрдпрд╛рдореБрд│реЗ рдЖрдордЪрд╛ рдмрд░рд╛рдЪ рд╡реЗрд│ рд╡рд╛рдЪреВ рд╢рдХрддреЛ. (рдлрдХреНрдд рдмрдВрдж рдХрд░рдгреЗ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ requiretty рддреБрдордЪреНрдпрд╛ рдордзреНрдпреЗ sudo рд╕рд╛рдареА рд╕реЗрдЯрд┐рдВрдЧ /etc/sudoers рд░рд┐рдореЛрдЯ рдорд╢реАрдирд╡рд░ рдлрд╛рдЗрд▓)

рдЕрдБрд╕рд┐рдмрд▓ рдУрд╡реНрд╣рд░рдХреНрд▓реЙрдХ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдПрдХ рдирд╡реАрди рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗ рдкрд╛рдпрдерди рд▓рд╛рдпрдмреНрд░рд░реА рдорд┐рдЯреЛрдЬреЗрди. рдЬрд░ рдХреЛрдгреА рддреНрдпрд╛рдмрджреНрджрд▓ рдРрдХрд▓реЗ рдирд╕реЗрд▓, рддрд░ рдореА рддреНрдпрд╛рдЪреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдЪреЗ рдереЛрдбрдХреНрдпрд╛рдд рд╡рд░реНрдгрди рдХрд░реЗрди. рд╣реЗ рд░рд┐рдореЛрдЯ рдорд╢реАрдирд╡рд░ рдкрд╛рдпрдерди рдХреЛрдб рдЬрд▓рдж рдЕрдВрдорд▓рд╛рдд рдЖрдгрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ рдЖрдгрд┐ рдЕреЕрдиреНрд╕рд┐рдмрд▓ рд╣реЗ рд╡рд╛рдкрд░рд╛рдЪреЗ рдлрдХреНрдд рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЖрд╣реЗ. Mitogen рд░рд┐рдореЛрдЯ рдорд╢реАрдирд╡рд░ UNIX рдкрд╛рдИрдк рд╡рд╛рдкрд░рддреЗ рдЖрдгрд┐ zlib рд╕рд╣ рд╕рдВрдХреБрдЪрд┐рдд рдХреЗрд▓реЗрд▓рд╛ рдЖрдгрд┐ рд▓реЛрдгрдЪреНрдпрд╛рд╕рд╣ рдЕрдиреБрдХреНрд░рдорд┐рдд рдкрд╛рдпрдерди рдХреЛрдб рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рддреЛ. рд╣реЗ рдЬрд▓рдж рдкреВрд░реНрдг рд╣реЛрдгреНрдпрд╛рд╕ рдорджрдд рдХрд░рддреЗ рдЖрдгрд┐ рд░рд╣рджрд╛рд░реА рд╡рд╛рдЪрд╡рддреЗ. рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгрд╛рдд рд╕реНрд╡рд╛рд░рд╕реНрдп рдЕрд╕рд▓реНрдпрд╛рд╕, рдкреГрд╖реНрдард╛рд╡рд░ рддреНрдпрд╛рдмрджреНрджрд▓ рд╡рд╛рдЪрдгреЗ рдЪрд╛рдВрдЧрд▓реЗ "рд╣реЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ". рдкрдг рдЖрдЬ рдЖрдкрдг рдлрдХреНрдд Ansible рд╕реЛрдмрдд рд▓рд╛рдпрдмреНрд░рд░реА рдХрд╢реА рдЪрд╛рд▓рддреЗ рдпрд╛рд╡рд░ рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдгрд╛рд░ рдЖрд╣реЛрдд.

рдорд┐рдЯреЛрдЬреЗрди рдХрд╛рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрдордзреНрдпреЗ рддреБрдордЪреНрдпрд╛ рдЙрддреНрддрд░рджрд╛рдпреА рдХреЛрдбрдЪрд╛ рд╡реЗрдЧ рдЕрдиреЗрдХ рд╡реЗрд│рд╛ рд╡рд╛рдврд╡реВ рд╢рдХрддреЛ рдЖрдгрд┐ рд░рд╣рджрд╛рд░реАрдЪрд╛ рд╡рд╛рдкрд░ рд▓рдХреНрд╖рдгреАрдпрд░реАрддреНрдпрд╛ рдХрдореА рдХрд░реВ рд╢рдХрддреЛ. рдЪрд▓рд╛ рд╕рд░реНрд╡рд╛рдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╡рд╛рдкрд░ рдкреНрд░рдХрд░рдгреЗ рддрдкрд╛рд╕реВ рдЖрдгрд┐ рддреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдХрд┐рддреА рдорджрдд рдХрд░рддреЗ рддреЗ рдкрд╛рд╣реВ.

рд░рд┐рдореЛрдЯ рдорд╢реАрдирд╡рд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реНрд╕ рддрдпрд╛рд░ рдХрд░рдгреЗ, рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ, рд░рд┐рдореЛрдЯ рдорд╢реАрдирд╡рд░ рдЖрдгрд┐ рд╡рд░реВрди рдлрд╛рдЗрд▓реНрд╕ рдХреЙрдкреА рдХрд░рдгреЗ рдпрд╛рд╕рд╛рдареА рдореА Ansible рд╡рд╛рдкрд░рддреЛ. рдХрджрд╛рдЪрд┐рдд рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЗрддрд░ рдЙрджрд╛рд╣рд░рдгреЗ рдЕрд╕рддреАрд▓ - рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдордзреНрдпреЗ рд▓рд┐рд╣рд╛.

рдЪрд▓рд╛ рдЬрд╛рдКрдпрд╛!

Ansible рд╕рд╛рдареА Mitogen рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдЦреВрдк рд╕реЛрдкреЗ рдЖрд╣реЗ:
Mitogen рд▓рд╛рдпрдмреНрд░рд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛:

pip install mitogen

рдЖрддрд╛ рджреЛрди рд╕рдорддреБрд▓реНрдп рдорд╛рд░реНрдЧ рдЖрд╣реЗрдд - рдПрдХрддрд░ ansible.cfg рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓рдордзреАрд▓ рдкрд░реНрдпрд╛рдп рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рд╛ рдХрд┐рдВрд╡рд╛ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╕реЗрдЯ рдХрд░рд╛.

рдЪрд▓рд╛ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░реВ рдХреА рд╕реНрдерд╛рдкрд┐рдд рдорд┐рдЯреЛрдЬреЗрдирдЪрд╛ рдорд╛рд░реНрдЧ рдЕрд╕реЗрд▓ /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. рдордЧ:

export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
export ANSIBLE_STRATEGY=mitogen_linear

рдХрд┐рдВрд╡рд╛

[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy

Mitogen рд╕реЛрдмрдд рдЖрдгрд┐ рд╢рд┐рд╡рд╛рдп рд╡рд░реНрдЪреБрдЕрд▓реЗрдирд╡реНрд╣рдордзреНрдпреЗ Ansible рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реВ:

virtualenv mitogen_ansible
./mitogen_ansible/bin/pip install ansible==2.7.10 mitogen
virtualenv pure_ansible
./pure_ansible/bin/pip install ansible==2.7.10

рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА Mitogen 0.2.7 Ansible 2.8 рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдд рдирд╛рд╣реА (рдореЗ 2019 рдкрд░реНрдпрдВрдд)

рдЙрдкрдирд╛рд╡реЗ рддрдпрд╛рд░ рдХрд░рдгреЗ:

alias pure-ansible-playbook='$(pwd)/pure_ansible/bin/ansible-playbook'
alias mitogen-ansible-playbook='ANSIBLE_STRATEGY_PLUGINS=$(pwd)/mitogen_ansible/lib/python3.7/site-packages/ansible_mitogen/plugins/strategy ANSIBLE_STRATEGY=mitogen_linear $(pwd)/mitogen_ansible/bin/ansible-playbook'

рдЖрддрд╛ рд░рд┐рдореЛрдЯ рдорд╢реАрдирд╡рд░ рдлрд╛рдЗрд▓реНрд╕ рддрдпрд╛рд░ рдХрд░рдгрд╛рд░реЗ рдкреНрд▓реЗрдмреБрдХ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Create files with copy content module
      copy:
        content: |
          test file {{ item }}
        dest: ~/file_{{ item }}
      with_sequence: start=1 end={{ n }}

рдЖрдгрд┐ 10 рдлрд╛рдЗрд▓реНрд╕ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА Mitogen рд╕реЛрдмрдд рдЖрдгрд┐ рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп рдЪрд╛рд▓рд╡реВрдпрд╛:

time mitogen-ansible-playbook file_creation.yml -i hosts -e n=10 &>/dev/null

real    0m2.603s
user    0m1.152s
sys     0m0.096s

time pure-ansible-playbook file_creation.yml -i hosts -e n=10 &>/dev/null

real    0m5.908s
user    0m1.745s
sys     0m0.643s

рдЖрдореНрд╣реА 2 рдкрдЯ рд╕реБрдзрд╛рд░рдгрд╛ рдкрд╛рд╣рддреЛ. рдЪрд▓рд╛ 20, 30, ..., 100 рдлрд╛рдИрд▓реНрд╕ рддрдкрд╛рд╕реВрдпрд╛:

time pure-ansible-playbook file_creation.yml -i hosts -e n=100 &>/dev/null

real    0m51.775s
user    0m8.039s
sys     0m6.305s

time mitogen-ansible-playbook file_creation.yml -i hosts -e n=100 &>/dev/null

real    0m4.331s
user    0m1.903s
sys     0m0.197s

рдкрд░рд┐рдгрд╛рдореА, рдЖрдореНрд╣реА 10 рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рд╡реЗрд│рд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреА рдЧрддреА рд╡рд╛рдврд╡рд▓реА!
рдЖрддрд╛ рднрд┐рдиреНрди рдкрд░рд┐рд╕реНрдерд┐рддреА рд╡рд╛рдкрд░реВрди рдкрд╣рд╛ рдЖрдгрд┐ рдЖрдкрд▓реНрдпрд╛рд╕рд╛рдареА рд╕рд░реНрд╡рдХрд╛рд╣реА рдХрд┐рддреА рдЬрд▓рдж рдХрд╛рд░реНрдп рдХрд░рддреЗ рддреЗ рдкрд╛рд╣реВ:

  • рд╕реНрдерд╛рдирд┐рдХ рд╡рд░реВрди рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯрд╡рд░ рдлрд╛рдЗрд▓ рдХреЙрдкреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдореЙрдбреНрдпреВрд▓рд╕рд╣ copy):
    Mitogen рд╕рд╣ рдЙрддреНрддрд░рджрд╛рдпреА рдЧрддреА рд╡рд╛рдврд╡рдгреЗ

  • рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯрд╡рд░ рдлрд╛рдЗрд▓реНрд╕ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реНрдХреНрд░рд┐рдкреНрдЯ copy рдореЙрдбреНрдпреВрд▓:
    Mitogen рд╕рд╣ рдЙрддреНрддрд░рджрд╛рдпреА рдЧрддреА рд╡рд╛рдврд╡рдгреЗ

  • рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯрд╡рд░реВрди рд╕реНрдерд╛рдирд┐рдХ рдлрд╛рдпрд▓реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдгреНрдпрд╛рдЪреА рдкрд░рд┐рд╕реНрдерд┐рддреА:
    Mitogen рд╕рд╣ рдЙрддреНрддрд░рджрд╛рдпреА рдЧрддреА рд╡рд╛рдврд╡рдгреЗ

рдЪрд▓рд╛ рдЕрдиреЗрдХ (3) рд░рд┐рдореЛрдЯ рдорд╢реАрдирд╕рд╣ рдПрдХ рдкрд░рд┐рд╕реНрдерд┐рддреА рд╡рд╛рдкрд░реВрди рдкрд╛рд╣реВ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде рд░рд┐рдореЛрдЯ рд╣реЛрд╕реНрдЯрд╡рд░ рдлрд╛рдпрд▓реА рдХреЙрдкреА рдХрд░рддрд╛рдирд╛:
Mitogen рд╕рд╣ рдЙрддреНрддрд░рджрд╛рдпреА рдЧрддреА рд╡рд╛рдврд╡рдгреЗ

рддреБрдореНрд╣реА рдмрдШреВ рд╢рдХрддрд╛, Mitogen рдпрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдВрдордзреНрдпреЗ рдЖрдкрд▓рд╛ рд╡реЗрд│ рдЖрдгрд┐ рд░рд╣рджрд╛рд░реА рджреЛрдиреНрд╣реА рд╡рд╛рдЪрд╡рддреЗ. рдкрд░рдВрддреБ рдЬрд░ рдЕрдбрдЪрдг рдЙрддреНрддрд░рджрд╛рдпреА рдирд╕реЗрд▓, рдкрд░рдВрддреБ рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде рдбрд┐рд╕реНрдХ рдХрд┐рдВрд╡рд╛ рдиреЗрдЯрд╡рд░реНрдХрдЪреНрдпрд╛ I/O рдордзреНрдпреЗ рдХрд┐рдВрд╡рд╛ рдЗрддрд░рддреНрд░, рддрд░ рдорд┐рдЯреЛрдЬреЗрди рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдорджрдд рдХрд░реЗрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдгреЗ рдХрдареАрдг рдЖрд╣реЗ.

pip рд╡рд╛рдкрд░реВрди yum/dnf рдЖрдгрд┐ python рдореЙрдбреНрдпреБрд▓рд╕рд╣ рдкреЕрдХреЗрдЬреЗрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╛рдкрд░реВрди рдкрд╛рд╣реВ. рдиреЗрдЯрд╡рд░реНрдХ рдЧреНрд▓рд┐рдЪрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рд░рд╛рд╣реВ рдирдпреЗ рдореНрд╣рдгреВрди рдкреЕрдХреЗрдЬреЗрд╕ рдХреЕрд╢реЗ рдХреЗрд▓реА рдЧреЗрд▓реА:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Install packages
      become: true
      package:
        name:
          - samba
          - httpd
          - nano
          - ruby
        state: present

    - name: Install pip modules
      become: true
      pip:
        name:
          - pytest-split-tests
          - bottle
          - pep8
          - flask
        state: present

Mitogen рд╕рд╣ рдпрд╛рд╕ 12 рд╕реЗрдХрдВрдж рд▓рд╛рдЧрд▓реЗ, рд╢рд┐рд╡рд╛рдп рд╕рд╛рд░рдЦреЗрдЪ.
рдкрд╛рдирд╛рд╡рд░ рдЙрддреНрддрд░рджрд╛рдпреА рдкреГрд╖реНрдард╛рд╕рд╛рдареА рдорд┐рдЯреЛрдЬреЗрди рддреБрдореНрд╣реА рдЗрддрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЖрдгрд┐ рдЪрд╛рдЪрдгреНрдпрд╛ рдкрд╛рд╣реВ рд╢рдХрддрд╛. рдкреГрд╖реНрда рдореНрд╣рдгрддреЗ рдореНрд╣рдгреВрди:

рдорд╛рдпрдЯреЛрдЬреЗрди рдореЙрдбреНрдпреВрд▓ рдЪрд╛рд▓реВ рдЕрд╕рддрд╛рдирд╛ рддреНрдпрд╛рдЪрд╛ рд╡реЗрдЧ рд╡рд╛рдврд╡реВ рд╢рдХрдд рдирд╛рд╣реА. рд╣реЗ рдХреЗрд╡рд│ рдпрд╛ рдореЙрдбреНрдпреВрд▓рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╢рдХреНрдп рддрд┐рддрдХреНрдпрд╛ рдЬрд▓рдж рдХрд░реВ рд╢рдХрддреЗ.

рддреНрдпрд╛рдореБрд│реЗ, рддреБрдордЪреНрдпрд╛ рддреИрдирд╛рддреАрдордзреАрд▓ рдЕрдбрдерд│реЗ рд╢реЛрдзрдгреЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ рдЖрдгрд┐ рдЬрд░ рддреЗ рдЙрддреНрддрд░рджрд╛рдпрд┐рддреНрд╡рд╛рдореБрд│реЗ рдЕрд╕рддреАрд▓, рддрд░ Mitogen рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░реЗрд▓ рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ рдкреНрд▓реЗрдмреБрдХрдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрд▓рд╛ рд▓рдХреНрд╖рдгреАрдп рдЧрддреА рджреЗрдИрд▓.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛