#python #multiprocessing
#python #многопроцессорная обработка
Вопрос:
У меня есть упрощенный код, который выполняется полностью до конца и будет нормально подключаться к процессу, и я заменил его более простыми частями, чтобы уменьшить ваше замешательство:
import math
import os
import numpy as np
import time
import multiprocessing
from multiprocessing import Process
from multiprocessing import Queue
import csv
def subu(remo,queue):
remlist=[[remo,4.6*remo,4.7*remo],[7.4*remo,6.5*remo,8.1*remo]]
queue.put(remlist)
return #remlist
thread_num=10
stime=time.perf_counter()
processes=[]
if __name__=="__main__":
q=Queue()
for i in range(thread_num):
proc=Process(target=subu,args=(i,q))
proc.start()
processes.append(proc)
print('afterstart')
for proc in processes:
proc.join()
lastlist=[]
print('afterjoin')
while not q.empty():
print('inqnotemp')
# time.sleep(10)
for _ in range(thread_num):
lastlist.append(q.get())
time.sleep(.1)
with open(f'lastlist.csv',"w",newline="") as f:
cw = csv.writer(f)
cw.writerows(r [""] for r in lastlist)
ftime=time.perf_counter()
print(f'total process in{ftime-stime}s finished')
input()
но приведенный ниже код, в котором мой основной код не присоединяется к процессам, код в порядке, за исключением того, что он не присоединяется к процессам:
import math
import os
import numpy as np
import time
import multiprocessing
from multiprocessing import Process
from multiprocessing import Queue
import csv
def dadesazlistfake11(dlist):
zlist=[]
for _ in range(11):
for i in range(len(dlist[575])):
zlist.append(dlist[575][i])
for j in range(len(columha[0])):
if(j%2==0):
zlist.append(max(dlist[i][1] for i in range(575 columha[2][j] ,575 columha[3][j] 1)))
if(j%2==1):
zlist.append(min(dlist[i][2] for i in range(575 columha[2][j] ,575 columha[3][j] 1)))
return zlist
def subu(remo,slist,queue):
rawlist=[]
remlist=[]
periodend=len(slist)-24
for l in range(575,periodend):
remlist.append(dadesazlistfake11(slist[l-575:l 25]))
if (l-576)%10==0:
print(f'{remo,l-576}')
ftime=time.perf_counter()
print(f'in{ftime-stime}s finished')
queue.put(remlist)
return #remlist
а остальной код похож:
def splito(a,b,c,d,e):
#bazehaye entehaei nemikhahim tu loop bashan
period=np.zeros(e 1).astype(int)
period[0]= a c-1 #575
period[e]= b-d-1 #489688
delta=int(math.floor((period[e]-period[0])/e))
for i in range(1,e):
period[i]=period[0] i*delta
return period
thread_num=10
rawlist=np.arange(800*5).reshape(-1,5)
rawlist=list(rawlist)
colnamesdropped=['datetime','start','15m1high','15m1low','end']
times=[['15m','30m','1H','6H','1d'],[1,2,4,24,96]]
nexttimes=[['1H','6H'],[4,24]]
columha=[[],[],[],[]]
s=0
l=0
for j in range(0,len(times[0])):
for k in range(1,7):
columha[0].append(s 6)
columha[1]=1
columha[2].append(-(k-1)*times[1][j]-times[1][j] 1)
columha[3].append(-(k-1)*times[1][j])
s=s 1
columha[0].append(s 6)
columha[1]=1
columha[2].append(-(k-1)*times[1][j]-times[1][j] 1)
columha[3].append(-(k-1)*times[1][j])
s=s 1
for j in range(0,len(nexttimes[0])):
if j==0:
for k in range(1,7):
columha[0].append(s 6)
columha[1]=1
columha[2].append( 1 (k-1)*nexttimes[1][j])
columha[3].append( 1 (k-1)*nexttimes[1][j] nexttimes[1][j]-1)
s=s 1
columha[0].append(s 6)
columha[1]=1
columha[2].append( 1 (k-1)*nexttimes[1][j])
columha[3].append( 1 (k-1)*nexttimes[1][j] nexttimes[1][j]-1)
s=s 1
elif j==1:
k=1
columha[0].append(s 6)
columha[1]=1
columha[2].append( 1 (k-1)*nexttimes[1][j])
columha[3].append( 1 (k-1)*nexttimes[1][j] nexttimes[1][j]-1)
s=s 1
columha[0].append(s 6)
columha[1]=1
columha[2].append( 1 (k-1)*nexttimes[1][j])
columha[3].append( 1 (k-1)*nexttimes[1][j] nexttimes[1][j]-1)
s=s 1
и эта заключительная часть основного кода:
period=splito(0,len(rawlist),96*6,24,thread_num)
tupleinput=[tuple([i,rawlist[period[i]-575:period[i 1] 24]]) for i in range(thread_num)]
stime=time.perf_counter()
processes=[]
if __name__=="__main__":
q=Queue()
for i in range(thread_num):
proc=Process(target=subu,args=(tupleinput[i][0],tupleinput[i][1],q))
proc.start()
processes.append(proc)
# rawlist=[]
# time.sleep(0.1)
print('afterstart')
for proc in processes:
proc.join()
# print('',)
lastlist=[]
print('afterjoin')
while not q.empty():
print('inqnotemp')
# time.sleep(10)
for _ in range(thread_num):
lastlist.append(q.get())
with open(f'lastlist.csv',"w",newline="") as f:
cw = csv.writer(f)
cw.writerows(r [""] for r in lastlist)
ftime=time.perf_counter()
print(f'total process in{ftime-stime}s finished')
input()
в чем проблема?Я использую Windows и pyhton 3.8 и, запустив сохраненный файл .py.
Ответ №1:
Если я не ошибаюсь, Process.join()
ожидает завершения процесса перед его завершением. Если вы хотите резко остановить процесс, выполните Process.terminate()
Комментарии:
1. нет, я хочу дождаться окончания процесса, не хочу его завершать грубой силой
2. Тогда вызов
join()
не будет иметь никакого эффекта, если процесс не является демоническим..join()
означает «дождаться завершения процесса» и вызывается автоматически во всех недемонических процессах. Ваш код работает нормально, единственной «проблемой», вероятно, было неправильное понимание.join()
использования метода. В противном случае, процессы, не присоединяющиеся, вызывают какие-либо проблемы?3. 1) итак, почему мой первый код (простая версия) работает хорошо? 2) что я должен делать?