簡體   English   中英

Python:同時運行多個進程

[英]Python: running multiple processes simultaneously

我正在嘗試在 python 中創建一個程序,該程序在不同的處理器上同時運行一個函數的多個實例 (15)。 我一直在研究這個,並使用 multiprocessing 中的 Process 工具設置了以下程序。

不幸的是,程序按順序執行函數的每個實例(它似乎在進入循環的下一部分之前等待一個完成)。

from __future__ import print_function
from multiprocessing import Process
import sys
import os
import re

for i in range(1,16):
    exec("path%d = 0" % (i))
    exec("file%d = open('%d-path','a', 1)" % (i, i))

def stat(first, last):
    for j in range(1,40000):
        input_string = "water" + str(j) + ".xyz.geocard"
        if os.path.exists('./%s' % input_string) == True:
            exec("out%d = open('output%d', 'a', 1)" % (first, first))
            exec('print("Processing file %s...", file=out%d)' % (input_string, first))
            with open('./%s' % input_string,'r') as file:
                for line in file:
                    for i in range(first,last):
                        search_string = " " + str(i) + " path:"
                        for result in re.finditer(r'%s' % search_string, line):
                            exec("path%d += 1" % i)

            for i in range(first,last):
                exec("print(path%d, file=file%d)" % (i, i))  

processes = []

for m in range(1,16):
    n = m + 1
    p = Process(target=stat, args=(m, n))
    p.start()
    processes.append(p)

for p in processes:
    p.join()

我對編程相當陌生,並且沒有並行化經驗 - 任何幫助將不勝感激。

我已經包含了上面的整個程序,用實際函數替換了“Some Function”,以證明這不是時間問題。 該程序可能需要幾天時間來循環瀏覽所有 40,000 個文件(每個文件都很大)。

我認為正在發生的事情是您在 some_function 中做得不夠,無法觀察並行發生的工作。 它生成一個進程,並在生成下一個進程之前完成。 如果您將隨機睡眠時間引入some_function ,您將看到它們實際上是並行運行的。

from multiprocessing import Process
import random
import time

def some_function(first, last):
    time.sleep(random.randint(1, 3))
    print first, last

processes = []

for m in range(1,16):
   n = m + 1
   p = Process(target=some_function, args=(m, n))
   p.start()
   processes.append(p)

for p in processes:
   p.join()

輸出

2 3
3 4
5 6
12 13
13 14
14 15
15 16
1 2
4 5
6 7
9 10
8 9
7 8
11 12
10 11

你確定嗎? 我剛剛嘗試過,它對我有用; 每次執行的結果都是亂序的,所以它們是並發執行的。

看看你的功能。 它需要“第一個”和“最后一個”,那么對於較低的值,它的執行時間是否更短? 在這種情況下,您可以預期編號較小的參數會降低運行時間,因此它看起來是並行運行的。

ps ux | grep python | grep -v grep | wc -l
> 16

如果您重復執行代碼(即使用 bash 腳本),您可以看到每個進程都在啟動。 如果您想確認這一點,請導入os並讓函數打印出os.getpid()以便您可以看到它們具有不同的進程 ID。

所以,是的,仔細檢查你的結果,因為在我看來你同時寫的很好!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM