STEM არა დაიკიდე ბევრ პროცესზე ბევრი სრედების გაშვება მინდოდა და გაიჭედა
ჩემ კოდში იყო შეცდომა მარტივი კოდი გაეშვა მულტისრედებზე
https://pythonspeed.com/articles/python-multiprocessing/5 პროცესი და თითოში 3 სრედის გაშვება მინდოდა.
და გაიჭედა.
The mystery is solved
Here’s why that original program is deadlocking—with their powers combined, the two problems with fork()-only create a bigger, sharkier problem:
Whenever the thread in the parent process writes a log messages, it adds it to a Queue. That involves acquiring a lock.
If the fork() happens at the wrong time, the lock is copied in an acquired state.
The child process copies the parent’s logging configuration—including the queue.
Whenever the child process writes a log message, it tries to write it to the queue.
That means acquiring the lock, but the lock is already acquired.
The child process now waits for the lock to be released.
The lock will never be released, because the thread that would release it wasn’t copied over by the fork().
Queue ქონდათ საერთო და დედლოქი ქონდა, როგორც ზემოთ დავწერე დამეზარა locking-ის და mutex-ები და ჯანდაბაების გარჩევა.
არადა თითქმის იმუშავა. მერე გადავწერე მარტო პროცესებზე და იმუშავა.
მარა რატო გაითიშა კომპი ეგ ვერ დავადგინე მაინც
ეგ სკრიპტი 3 თვეში ერთხელ თუ დამჭირდება და იმუშაოს ნელა 2 საათი ბექგრაუნდში არაფერი უჭირს
ეგ კოდი იძახებს რამდენიმე ეიფიაის რომელიც ჯეოსონს აბრუნებს რომელსაც აქვს ნესტით სტურქტურა, სიღრმე არ ვიცი და მიწევს რეკურსიულად ჩასვლა. აქედან ცალკე ეიფიაი გილიმითებს 1 ეიფიაი ქოლზე მაქსიმალური ჩანაწერების დაბრუნებს და აქაც მიწევს რეკურსიის გამოყენება.
რამდენიმე მილიონი ჩანაწერია. ვიცი concurent.futures ან რამე ეგეთი უნდა გამომეყენებინა.
მარა რადგან ადრე რაღაც მსგავსი დავწერე წავედი პროცესების და სრედების გზით რო io-ს დიდხანს არ ველოდო. პრინციპში ასინქრული კოდითაც იგივე შედეგს მივაღწევ ნეთქვორს აღარ დაველოდები. მარა ეგ არ მაწყობს. იმიტომ როგორც ვთქვი ეიფია 50 ჩანაწერს გიბრუნებს თითო გამოძახებაზე და გაძლევს iteration handle-ს რომელზეც უნდა გააგზავნო შემდეგი ქოლი რომ შემდეგი 50 ჩანაწერი გამოგიგზავნოს. მოკლედ არ ღირს ამდენი ჩალიჩი.
ბოლოს ვიწვალე და იქამდე ასწრაფდა რო მბლოკავდა უკვე მაქსიმალურ ქონექშენებს ვაჭარბებდი და ბოლოს ამის დედაც ვატირე თქო და ჩვეულებრივად გავუშვი კი უნდება 2 საათს მაგის დედაც ვატირე
თუ გინდა 5 დღ მოანდომოს ეგ არაა პრინციპული. პროსტა მუღამი მქონდა ერთი ჩაჯდომით მულტი პროცეს მულტისრედიდ სკრიპტი დამეწერა და ბოლოს არქიტექტურას დავაბრალე.
ამ სკრიპტს მაინც მ ივიყვან იმ დონემდე რო თან არ დამბლოკოს და ტან მაქსიმალური სიჩქარით იმუშაოს. ჩავუჯდები მერე) როგორც დავთვალე წამში 5 გამოძახებაზე მეტს არ მაკეთებინებს და როგორმე ეგ უნდა მივალიმიტო.
This post has been edited by NinjaRacer on 15 Sep 2021, 23:58