मेरे पास यह गो कोड है जो एक निर्देशिका फ़ाइल पेड़ पर चलता है और इसमें प्रत्येक फ़ाइल के एमडी 5 हैश उत्पन्न करता है और परिणाम आउटपुट फ़ाइल में लिखता है।

package main

import (
    "crypto/md5"
    "encoding/hex"
    "fmt"
    "io"
    "os"
    "path/filepath"
    "sync"
)

func main() {

    filePath := os.Args[1]
    output := os.Args[2]
    wg := &sync.WaitGroup{}

    err := filepath.Walk(filePath, func(path string, info os.FileInfo, err error) error {
        if !info.IsDir() {
            wg.Add(1)
            go func(path string) {
                md5Sum, _ := md5File(path)
                if err := writeToFile(path, md5Sum, output); err != nil {
                    panic(err)
                }
                wg.Done()
            }(path)
        }
        return nil
    })
    if err != nil {
        panic(err)
    }
    wg.Wait()
}

func md5File(filePath string) (string, error) {
    file, err := os.Open(filePath)
    if err != nil {
        return "", err
    }
    defer file.Close()

    hash := md5.New()
    if _, err := io.Copy(hash, file); err != nil {
        return "", err
    }

    checksum := hash.Sum(nil)

    return string(hex.EncodeToString(checksum)), nil
}

func writeToFile(filePath, md5sum, output string) error {

    file, err := os.OpenFile(output, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0755)
    if err != nil {
        return err
    }

    defer file.Close()

    file.WriteString(fmt.Sprintf("%s %s\n", md5sum, filePath))

    return file.Sync()
}

मेरी समझ से यह आउटपुट फ़ाइल पर लिखने पर कभी-कभी दौड़ की स्थिति में चलने के लिए बाध्य है लेकिन ऐसा कभी नहीं होता है। मेरा मतलब है कि मैंने इस कोड को अनगिनत बार निष्पादित किया है जिसमें कभी भी कोई समस्या नहीं आई है। यह हर बार एक ही परिणाम उत्पन्न करता है।

ऐसा क्यों है? क्या मैं कुछ भूल रहा हूँ?

अद्यतन: जब मैं कहता हूं कि यह एक दौड़ की स्थिति का सामना करने के लिए बाध्य है, तो मेरा मतलब है कि जब एक से अधिक गोरौटाइन एक ही समय में फाइल करने के लिए लिखना चाहते हैं, तो एक से अधिक गोरआउटिन चलाना संभव है।

-3
Hamed Momeni 8 मई 2019, 13:28

1 उत्तर

सबसे बढ़िया उत्तर

जब मैं कहता हूं कि यह एक दौड़ की स्थिति का सामना करने के लिए बाध्य है, तो मेरा मतलब है कि जब एक से अधिक गोरौटाइन एक ही समय में फ़ाइल में लिखना चाहते हैं, तो एक से अधिक गोरोइन चलाना संभव है।

एक फाइल को कई बार खोलना कोई समस्या नहीं है। और चूंकि आप स्पष्ट रूप से O_APPEND का उपयोग करते हैं, इसलिए लेखन एक दूसरे के साथ बुरी तरह से बातचीत नहीं करते हैं। उल्लेख करना मैन ओपन से:

O_APPEND ...
प्रत्येक लेखन (2) से पहले, फ़ाइल ऑफ़सेट फ़ाइल के अंत में स्थित है, जैसे कि lseek (2) के साथ। फ़ाइल ऑफ़सेट का संशोधन और लेखन कार्य एकल परमाणु चरण के रूप में किया जाता है

2
Steffen Ullrich 8 मई 2019, 10:43