我想要一些守护进程来找到我需要转换成网络和拇指版本的图像。我认为 python 在这里可能很有用,但我不确定我是否在这里做事。我想同时转换8张照片,要转换的图像队列可能很长。我们在服务器上有几个核心,在一个新进程中生成每个转换应该让操作系统利用可用的核心,事情会变得更快,对吧?这是这里的关键点,从 python 中创建一个再次调用 imagemagick 的转换脚本的进程,并希望事情比从 python 主线程运行一对一的转换快一点。
到目前为止,我才开始测试。所以这是我的测试代码。它将创建 20 个任务(即休眠 1 到 5 秒),并将这些任务分配给一个总共有 5 个线程的池。
from multiprocessing import Process
from subprocess import call
from random import randrange
from threading import Thread
from Queue import Queue
class Worker(Thread):
def __init__(self, tid, queue):
Thread.__init__(self)
self.tid = tid
self.queue = queue
self.daemon = True
self.start()
def run(self):
while True:
sec = self.queue.get()
print "Thread %d sleeping for %d seconds\n\n" % (self.tid, sec)
p = Process(target=work, args=(sec,))
p.start()
p.join()
self.queue.task_done()
class WorkerPool:
def __init__(self, num_workers):
self.queue = Queue()
for tid in range(num_workers):
Worker(tid, self.queue)
def add_task(self, sec):
self.queue.put(sec)
def complete_work(self):
self.queue.join()
def work(sec):
call(["sleep", str(sec)])
def main():
seconds = [randrange(1, 5) for i in range(20)]
pool = WorkerPool(5)
for sec in seconds:
pool.add_task(sec)
pool.complete_work()
if __name__ == '__main__':
main()
所以我在服务器上运行这个脚本:
johanhar@mamadev:~$ python pythonprocesstest.py
然后我检查服务器上的进程:
johanhar@mamadev:~$ ps -fux
结果在ps
我看来是错误的。对我来说,看起来好像我在 python 下发生了一些事情,但在一个进程中,所以即使我们在服务器上有多个内核,它只会越慢转换(或在这个测试用例中睡眠)越慢......
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
johanhar 24246 0.0 0.0 81688 1608 ? S 13:44 0:00 sshd: johanhar@pts/28
johanhar 24247 0.0 0.0 108336 1832 pts/28 Ss 13:44 0:00 \_ -bash
johanhar 49753 0.6 0.0 530620 7512 pts/28 Sl+ 15:14 0:00 \_ python pythonprocesstest.py
johanhar 49822 0.0 0.0 530620 6252 pts/28 S+ 15:14 0:00 \_ python pythonprocesstest.py
johanhar 49824 0.0 0.0 100904 564 pts/28 S+ 15:14 0:00 | \_ sleep 4
johanhar 49823 0.0 0.0 530620 6256 pts/28 S+ 15:14 0:00 \_ python pythonprocesstest.py
johanhar 49826 0.0 0.0 100904 564 pts/28 S+ 15:14 0:00 | \_ sleep 3
johanhar 49837 0.0 0.0 530620 6264 pts/28 S+ 15:14 0:00 \_ python pythonprocesstest.py
johanhar 49838 0.0 0.0 100904 564 pts/28 S+ 15:14 0:00 | \_ sleep 3
johanhar 49846 0.0 0.0 530620 6264 pts/28 S+ 15:14 0:00 \_ python pythonprocesstest.py
johanhar 49847 0.0 0.0 100904 564 pts/28 S+ 15:14 0:00 \_ sleep 3
因此,如果您仍然没有得到问题或我的要求。这种方法可以称为“多核编程”吗?