社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

子进程不会在并行多处理Python中运行

Sénéchal Julien • 3 年前 • 1280 次点击  

我尝试了很多方法来调用我的子进程,以便同时运行它们。它创建所有进程,但一次只运行一个。

我的3个进程通过套接字(multiprocessing.connection.Listener/Client)与主进程通信。不同的进程各自读取不同的文件,因此不应存在I/O问题。

这里有我尝试过的一切:

1.

pool = Pool(cpu_count())
j = 0
while j < procs:
    pool.apply_async(run, args=())
    sleep(0.2)
    j += 1
pool.close()
j = 0
while j < procs:
    processes.append(Process(target=run, args=()))
    processes[-1].start()
    sleep(0.2)
    j += 1
pool = Pool(cpu_count())
j = 0
while j < procs:
    pool.apply(run, args=())
    sleep(0.2)
    j += 1
pool.close()

提前感谢您的帮助

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129809
 
1280 次点击  
文章 [ 1 ]  |  最新文章 3 年前
Masklinn
Reply   •   1 楼
Masklinn    3 年前
pool = Pool(cpu_count())

无用,这是默认行为

pool.apply_async(run, args=())
sleep(0.2)

这符合 任务,因为你在之后睡觉,除非任务需要超过200毫秒(这是不可能的,200毫秒是不可能的) 很多 )所有提交文件将按顺序进行

processes.append(Process(target=run, args=()))
processes[-1].start()
sleep(0.2)

同上,但可能更糟(目前尚不清楚 start() 是的)。

pool.apply(run, args=())
sleep(0.2)

apply 正在阻塞,因此这将向队列提交一个作业 等到工作完成 .

只有第一个版本才有机会利用这个池,因为提交后你要睡200毫秒,所以作业需要至少200毫秒才能并行。

你一点也不想解释什么 run 是的,你唯一要说的是他们正在读取文件,但即使是入门级SSD也有GB/s级带宽,所以你至少需要读取数百MBs的文件才能感觉到这种效果(如果你使用非常低效的读取方法,可能会更少)。

使用进程池的正确方法是 apply_async 在一个紧密的循环中,或者使用 map_async imap_unordered 将批量作业发送到池中,并让池在工人之间分配工作。

而且

不同的进程各自读取不同的文件

当然没有任何迹象或证据表明这一点,因为它们运行的都是相同的 没有参数的函数。