乐趣区

关于python:subprocess-会阻塞-eventlet-的并发吗

如果不打猴子补丁,就会阻塞:

import eventlet
# eventlet.monkey_patch()
from loguru import logger
import subprocess

def func():
    p = subprocess.Popen('time sleep 3', stderr=subprocess.STDOUT,
                         stdout=subprocess.PIPE, shell=True, close_fds=True)
    out_str, err_str = p.communicate()
    p.wait()
    _process_result = out_str.decode(encoding='utf-8')

    logger.debug(_process_result)


pool = eventlet.GreenPool()

pool.spawn_n(func)
pool.spawn_n(func)
pool.spawn_n(func)

pool.waitall()

一共花了 9 秒

─➤  time python -u "/home/bot/Desktop/ideaboom/test_evenetlet/need_lock_with_sleep.py"
2022-08-30 01:04:52.159 | DEBUG    | __main__:func:22 - 0.00user 0.00system 0:03.00elapsed 0%CPU (0avgtext+0avgdata 2240maxresident)k
0inputs+0outputs (0major+124minor)pagefaults 0swaps

2022-08-30 01:04:55.163 | DEBUG    | __main__:func:22 - 0.00user 0.00system 0:03.00elapsed 0%CPU (0avgtext+0avgdata 2240maxresident)k
0inputs+0outputs (0major+124minor)pagefaults 0swaps

2022-08-30 01:04:58.172 | DEBUG    | __main__:func:22 - 0.00user 0.00system 0:03.00elapsed 0%CPU (0avgtext+0avgdata 2208maxresident)k
0inputs+0outputs (0major+122minor)pagefaults 0swaps

python -u "/home/bot/Desktop/ideaboom/test_evenetlet/need_lock_with_sleep.py"  0.29s user 0.03s system 3% cpu 9.316 total

如果打猴子补丁,就会不会阻塞:

import eventlet
eventlet.monkey_patch()
from loguru import logger
import subprocess

def func():
    p = subprocess.Popen('time sleep 3', stderr=subprocess.STDOUT,
                         stdout=subprocess.PIPE, shell=True, close_fds=True)
    out_str, err_str = p.communicate()
    p.wait()
    _process_result = out_str.decode(encoding='utf-8')

    logger.debug(_process_result)


pool = eventlet.GreenPool()

pool.spawn_n(func)
pool.spawn_n(func)
pool.spawn_n(func)

pool.waitall()

这个时候,一共就用了 3 秒

─➤  time python -u "/home/bot/Desktop/ideaboom/test_evenetlet/need_lock_with_sleep.py"
2022-08-30 00:41:48.751 | DEBUG    | __main__:func:22 - 0.00user 0.00system 0:03.00elapsed 0%CPU (0avgtext+0avgdata 2244maxresident)k
0inputs+0outputs (0major+123minor)pagefaults 0swaps

2022-08-30 00:41:48.752 | DEBUG    | __main__:func:22 - 0.00user 0.00system 0:03.00elapsed 0%CPU (0avgtext+0avgdata 2224maxresident)k
0inputs+0outputs (0major+123minor)pagefaults 0swaps

2022-08-30 00:41:48.752 | DEBUG    | __main__:func:22 - 0.00user 0.00system 0:03.00elapsed 0%CPU (0avgtext+0avgdata 2224maxresident)k
0inputs+0outputs (0major+122minor)pagefaults 0swaps

python -u "/home/bot/Desktop/ideaboom/test_evenetlet/need_lock_with_sleep.py"  0.42s user 0.03s system 13% cpu 3.446 total
退出移动版