2017-09-01 7 views
0

Ubuntu OSでPython 3.5を使用して私のプログラムの出力をファイルに書き込もうとしています。ここで私がマルチスレッドを試みる前に最初に試したことがあります。Python 3.5でプログラムMultiThreadを作成しようとしましたが失敗しました

from fuzzywuzzy import process, fuzz 
import ast 

def people(email): 


     #Checking the names of people with fuzzywuzzy library of python 

    return([returns result]) 

writel = open (r'output.csv','w',encoding='utf-8',errors='ignore') 

with open ('emailfile.txt','r',encoding='ascii',errors='ignore') as Filepointer: 
    result = [] 
    for line in Filepointer.readlines(): 
     count += 1 

     data = people(line.strip()) 

     if data is not "": 
      result.append(data) 
for data in result: 
    writel.write(str(data) + "\n") 

writel.close()  

は、それから私は、次のコードを使ってPython 3にマルチスレッド化しようとしました:

from fuzzywuzzy import process, fuzz 
import ast 
from concurrent.futures import ThreadPoolExecutor 
import threading 
global FinalOutput 
def people(email): 


     #Checking the names of people with fuzzywuzzy library of python 

    FinalOutput.append([appends returned result]) 
    print (FinalOutput) 
    return 




threads = [] 
writel = open (r'output.csv','w',encoding='utf-8',errors='ignore') 
count = 0 
pool = ThreadPoolExecutor(max_workers=10) 
with open ('emailfile.txt','r',encoding='ascii',errors='ignore') as Filepointer: 
    for line in Filepointer.readlines():   
     pool.submit(people,line.strip()) 
pool.shutdown(wait=True)     
for data in FinalOutput: 
    writel.write(str(data) + "\n") 

writel.close()  

上記のコードは次のエラー生成:

Segmentation fault (core dumped) 

を私はに関連StackOverflowの中のスレッドを経ていこの問題は解決されませんでした。私はまだ同じエラーが発生します。
コードを実行するために必要なことを教えてください。

+0

なぜマルチスレッド化したいですか? –

+0

入力ファイルが膨大で、ロジックの実行に時間がかかっていたため、以前のプロセスではシングルスレッドのみを使用していたため、プロセスがマルチスレッド化されると考えました。したがって、マルチスレッドは確実に完全なプロセスを向上させます。だから私はそれを考えました。 –

+0

これは[mcve]ではありません。例 'FinalOutput.append([email、names [0] [0]、names [0] [1])'は有効な構文ではなく、 'names'も定義されていません(' FinalOutput'も定義されていません)。 –

答えて

1

Pythonには、マルチプロセッシングプールと呼ばれる優れた並列化ツールがあります。マルチスレッドではありませんが、並列化されていますが、これはあなたの意図と思われます。私たちがやるだろうと、代わりにグローバル変数に結果を追加の値を返すpeople作るです:

def people(email): 
    # This is where the magic happens 
    return result 

そこから私たちはPoolを作成して、自動的に反復可能で返された値を配信してmap機能を呼び出すことができますし、彼らは反復可能な内された順番で、リストにそれらを返します。

from multiprocessing import Pool 

with open(r'output.csv','w',encoding='utf-8',errors='ignore') as FilePointer: 
    with Pool() as pool: 
     FinalOutput = pool.map(people, FilePointer.readlines()) 

with open(r'output.csv', 'w', encoding='utf-8', errors='ignore') as writel: 
    for data in FinalOutput: 
     writel.write(str(data) + '\n') 

あなたがまたしても滑らかな印象、より柔軟な方法でこれを行う機能を持っていjoblibと呼ばれるパッケージに見ることができます。

関連する問題