Вызов Join () останавливает выполнение, пока я создаю процесс с модулем Multyprocessing - PullRequest
0 голосов
/ 29 апреля 2019

Я провожу некоторые тесты с использованием многопроцессорных функций и сталкиваюсь с проблемой зависания после вызова функции соединения.

import time
import math
import pandas as pd
import numpy as np
from multiprocessing import Process, Queue, Lock, Value

def writeDF(start,end,td,lock,q):
    print('write from ',start,' ',end)
    for  i in range(start,end):
        lock.acquire()
        q.put(td.iloc[i,:])
        lock.release()
    print('function writeDF completed')

if __name__ == '__main__':
    td=pd.read_csv(r'C:\Users\dorian\Desktop\Analyzer.txt', encoding = "ISO-8859-1", index_col="Start", parse_dates=True, sep=',')
    td=td[0:10] 
    jobs=[]
    q = Queue()
    lock = Lock()


    start = time.time()

    begin=0
    stop=td.shape[0]/2

    for i in range(0,2):
        if len(jobs) < 10:
            t = Process(target=writeDF, args=(int(begin),int(stop),td, lock,q))
            t.start()
            jobs.append(t)
            begin=stop
            stop=stop+(td.shape[0]/2)
        else:    
            t = jobs.pop(0)
            t.join()

    for p in jobs: 
        print('try to join element:',p)
        p.join()
        print('element is join')

    l=[]    
    while not q.empty():
        l.append(q.get())

    df=pd.DataFrame(l)
    end = time.time()  
    print('Value:',df.shape)
    print('2 process Time taken in seconds -', end - start)

Фактический результат - программа зависает в операторе join (), однако, поскольку start () находится перед join (), она не должна блокироваться

1 Ответ

0 голосов
/ 29 апреля 2019

multiprocessing.Queue очереди имеют емкость, ограниченную базовыми каналами уровня ОС, используемыми для их реализации. Это означает, что вы не можете ждать, пока авторы закончат читать. Писатели и читатели должны выполнять одновременно, чтобы безопасно использовать multiprocessing.Queue. Ты этого не делаешь.

...