Windows では、マルチプロセッシングを使用する前に、プロセスがメインかどうかを確認する必要があります。そうしないと、無限ループが発生します。
呼び出したクラスまたは関数内からマルチプロセッシングを使用するために、プロセスの名前をサブプロセスの名前に変更しようとしましたが、うまくいきませんでした。これは可能ですか?メインプロセスを使用していない限り、最新のマルチプロセッシングを使用できませんでした。
可能であれば、より高いプロセスから呼び出されているクラスまたは関数内でマルチプロセッシングを使用する方法の例を誰かが提供できますか? ありがとう。
編集:
ここに例があります - 最初のものは機能しますが、すべてが 1 つのファイルで行われます: simplemtexample3.py:
import random
import multiprocessing
import math
def mp_factorizer(nums, nprocs):
#schtze den prozess
#print __name__
if __name__ == '__main__':
out_q = multiprocessing.Queue()
chunksize = int(math.ceil(len(nums) / float(nprocs)))
procs = []
for i in range(nprocs):
p = multiprocessing.Process(
target=worker,
args=(nums[chunksize * i:chunksize * (i + 1)],
out_q))
procs.append(p)
p.start()
# Collect all results into a single result dict. We know how many dicts
# with results to expect.
resultlist = []
for i in range(nprocs):
temp=out_q.get()
index =0
#print temp
for i in temp:
resultlist.append(temp[index][0][0:])
index +=1
# Wait for all worker processes to finish
for p in procs:
p.join()
resultlist2 = [x for x in resultlist if x != []]
return resultlist2
def worker(nums, out_q):
""" The worker function, invoked in a process. 'nums' is a
list of numbers to factor. The results are placed in
a dictionary that's pushed to a queue.
"""
outlist = []
for n in nums:
newnumber= n*2
newnumberasstring = str(newnumber)
if newnumber:
outlist.append(newnumberasstring)
out_q.put(outlist)
l = []
for i in range(80):
l.append(random.randint(1,8))
print mp_factorizer(l, 4)
ただし、別のファイルから mp_factorizer を呼び出そうとすると、if __name__ == '__main__'
次の理由で機能しません。
simplemtexample.py
import random
import multiprocessing
import math
def mp_factorizer(nums, nprocs):
#schtze den prozess
#print __name__
if __name__ == '__main__':
out_q = multiprocessing.Queue()
chunksize = int(math.ceil(len(nums) / float(nprocs)))
procs = []
for i in range(nprocs):
p = multiprocessing.Process(
target=worker,
args=(nums[chunksize * i:chunksize * (i + 1)],
out_q))
procs.append(p)
p.start()
# Collect all results into a single result dict. We know how many dicts
# with results to expect.
resultlist = []
for i in range(nprocs):
temp=out_q.get()
index =0
#print temp
for i in temp:
resultlist.append(temp[index][0][0:])
index +=1
# Wait for all worker processes to finish
for p in procs:
p.join()
resultlist2 = [x for x in resultlist if x != []]
return resultlist2
def worker(nums, out_q):
""" The worker function, invoked in a process. 'nums' is a
list of numbers to factor. The results are placed in
a dictionary that's pushed to a queue.
"""
outlist = []
for n in nums:
newnumber= n*2
newnumberasstring = str(newnumber)
if newnumber:
outlist.append(newnumberasstring)
out_q.put(outlist)
単純なexample.pyを開始します
import simplemtexample as smt
import random
l = []
for i in range(80):
l.append(random.randint(1,8))
print smt.mp_factorizer(l, 4)