Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%)
|
Dawno mnie tu nie było (IMG:style_emoticons/default/smile.gif)
Forumowicze, problem z kolejką w PHP. System, który tworzę przetwarza dane co minutę (z CRONa). Niestety uruchomienie pojedynczego procesu np, przetwarzaj.php nie kończy się w 1 minucie, ponieważ przetwarzanie danych może trwać np. 2 mninuty dla pojedynczego rekordu bazy danych, a rekordów jest np. 20. Teoretycznie szeregowe uruchomienie przetwarzania zajmie więc 40 min. Każdy przetwarzaj.pho bierze z bazy zatem 1 rekord i tylko taki mieli. Moje pytanie: w jaki sposób napisać kolejkę, która poprawnie przetworzy takie dane? Wywołać z crona 20x ten sam przetwarzaj.php? Zanim proces zacznie wykonywać swoją pracę, ustawia na rekordzie bazy, że jest on przetwarzany, więc inny proces weźmie kolejne dane. Spotkaliście się z podobnym problemem, macie pomysły? |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%)
|
Cytat Proces nie obciąża procesora. Długo wykonuje się, ponieważ przesyła dane i też niedużo, ale klient odbierający dane przetwarza je i to zajmuje czas. Tak więc tutaj może to mieć rzeczywiście sens. Musisz tylko pamiętać, że jednoczesne podesłanie znaczącej ilości żądań do drugiej strony może ją "zamulić" i w efekcie jeszcze bardziej wydłużyć ogólny czas działania. Prawdopodobnie dobrym pomysłem będzie wysyłanie jakiejś ograniczonej ilości żądań jednocześnie, np. 5 albo 20.Cytat Jeśli chodzi o Javę, to faktycznie mógłbym jej użyć, ale to banalny kod w PHP, jeśli udałoby się tylko wywołać 20 równoległych procesów to myślę, że byłoby OK. Tak na pierwszy rzut oka, wykonanie tego np. w Javie będzie znacznie prostsze niż w PHP. Jeden wątek pobierający rekordy do obrobienia (w ilości np. 100), który będzie je wrzucać na stos oraz 5-10-20 wątków pobierających po jednym elemencie ze stosu i przetwarzających go. W momencie gdy ilość rekordów na stosie się kończy będzie on pobierać sobie następną porcję.Zero problemów z wielokrotnym obrabianiem tego samego rekordu, "prosta" baza danych nie wymagająca żadnego dbania o współbieżność (brak LOCKów), jeden proces w systemie zamiast n+1 (czyli łatwe okiełznanie tego). Całość pewnie w 50 linijkach kodu by się zmieściła, z czego połowa to pewnie by były klamerki. Cytat Co z forkowaniem? Jak ten Demon w PHP? Ktoś to wdrażał w profesjonalnych zastosowaniach? W forkowanie nigdy się w PHP nie bawiłem - ono się po prostu do tego kompletnie nie nadaje. Daemon w PHP? Jak najbardziej, ale pojedynczy.EDIT: Oczywiście strukturą danych przechowującą rekordy do przetworzenia powinna być tytułowa kolejka, nie stos. Ten post edytował Crozin 23.05.2012, 19:43:37 |
|
|
|
Prph Kolejka w PHP, 23.05.2012, 05:35:28
Crozin Podstawowe pytanie: czy przetworzenie kilku, np. m... 23.05.2012, 06:21:21
Prph Tak, przecież zostaną wykonane równolegle. Wykonaj... 23.05.2012, 06:39:57 
!*! Cytat(Prph @ 23.05.2012, 07:39:57 ) T... 23.05.2012, 07:01:57
hind Zły tok rozumowania... równoległe uruchomienie spw... 23.05.2012, 07:05:05
Prph No bez przesady. 16 rdzeni przetworzy szybciej 16 ... 23.05.2012, 07:17:50
Crozin To może inaczej, co jest powodem tak długiego prze... 23.05.2012, 07:23:40
Prph No to jest odpowiedź na wysokim poziomie
Proces ... 23.05.2012, 18:51:59
Niktoś Php z natury nie jest wielowątkowe(czyt.threading)... 23.05.2012, 19:14:15
Prph Zrobione za pomocą forkowania. Aż miło patrzeć jak... 24.05.2012, 06:19:42
Crozin Aż mnie coś wzięło, żeby zobaczyć jak można zrobić... 27.05.2012, 00:21:13
cezet Witajcie,
Pewnie mnie teraz zjedziecie, bo jak śm... 30.05.2012, 13:10:15
Crozin Cytat[...] procesy nie mogły działać równolegle.A ... 30.05.2012, 13:49:20
greycoffey Nie zjedziemy, acz wytkniemy błąd.
Ten skrypt to t... 30.05.2012, 13:52:30
cezet Zwracam honor 30.05.2012, 14:12:33 ![]() ![]() |
|
Aktualny czas: 24.12.2025 - 06:23 |