Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: 2 skrypty w tym samym czaseie
Forum PHP.pl > Forum > PHP
Black-Berry
Zastanawiam sie czy 2 skrypty php mogą zacząć wykonywać się równolegle? Przy jednym procesorze to chyba niemożliwe prawda? A co jeśli serwer jest wieloprocesorowy? Czy wtedy mogą wykonywać się obok siebie?

Czy jeśli nie wykonują się równolegle to po co korzystać z LOCK TABLES?
zzeus
Polecam:
Procesy
Wątki
Black-Berry
blinksmiley.gif Czemu nie podałeś mi linku do "kolei dwuszynowej" i "czteropasmowej autostrady" ?
Zyx
Nie rozumiem, dlaczego jeden procesor miałby być przeszkodą. W jaki sposób pisałeś tego posta, jednocześnie słuchając muzyki, mając otwarty komunikator, edytor kodu i ściągając coś w tle? Twój komputer miał 5 procesorów czy jeden? Wielozadaniowość realizowana jest poprzez szybkie, niezauważalne dla człowieka, przełączenia między poszczególnymi zadaniami realizowane przez system operacyjny. PHP nie jest jakimś magicznie, szczególnie wyróżnionym programem, że w jego przypadku ta zasada nie obowiązuje. Jeśli FastCGI będzie mieć aktualnie pięć procesów PHP odpalonych, to w tym samym czasie mniej więcej może wykonywać się pięć skryptów. Jeśli Apache utworzy pięć wątków do obsługi żądań HTTP wymagających wykonania skryptu PHP, to one też się będą wykonywać równolegle. Nie jest to wprawdzie rzeczywista równoległość, bo w danym momencie wykonywane jest jedno zadanie, ale dzięki tym właśnie przełączeniom proces wykonywania wszystkich pięciu skryptów postępuje jednocześnie.

Co więcej, obecne procesory rzadko kiedy posiadają tylko jeden rdzeń - normą są dwa, a często spotkać już można i cztery. Jeśli system operacyjny przyporządkuje dwa skrypty do różnych rdzeni, będziesz mieć prawdziwą równoległość na jednym procesorze.

Tak więc używanie LOCK TABLES zawsze jest zasadne, bo nie żyjemy w czasach systemu CP/M i DOS-a, gdzie naraz mógł być uruchomiony tylko jeden program. A tak w ogóle to lepiej używać transakcji - dają to samo, co blokowanie, wymagają mniej zachodu i w razie wykrzaczenia się skryptu lub bazy w połowie transakcji wszystkie wprowadzone przez nią zmiany są natychmiast cofane.
sowiq
Cytat(Black-Berry @ 4.03.2009, 13:16:50 ) *
blinksmiley.gif Czemu nie podałeś mi linku do "kolei dwuszynowej" i "czteropasmowej autostrady" ?
Ponieważ to nie byłoby na temat. Pytałeś o równoległe uruchomienie kilku skryptów, ~zzeus dał Ci odpowiedź. Robi się to poprzez wielowątkowość lub odpalanie kolejnych procesów.
No chyba, że chodzi Ci o "równoległe działanie" polegające na tym, że w 2 oknach przeglądarki wpiszesz ten sam adres smile.gif
Black-Berry
Rozumiem że programy wykonują się równolegle. Nie byłem tylko pewny jak to się ma do styku Baza/Aplikacja. Jak więc równoległy proces PHP reaguje np na TABLE LOCK? Ustawia się w kolejce i czeka aż tabela się zwolni czy zaprzestaje odczytu lub zapisu do bazy?

Druga sprawa jaka mnie martwi to czy powinno się ustawiać LOCK na tabeli przed rozpoczęciem transakcji? Obawiam się o bazę mySQL która ostatnio mi się wykrzaczyła z niewyjaśnionych przyczyn.
Zyx
PHP reaguje w ten sposób, że wysyła to zapytanie do bazy i jak baza każe mu czekać, to czeka, jako że w kodzie objętym blokadą zapisu może być tylko jeden wątek naraz (ten, który blokadę nałożył). W przypadku transakcji stosowanie blokowania nie jest konieczne. Bazy danych zezwalają nawet na równoległe wykonywanie się dwóch transakcji operujących na tych samych danych - nie pamiętam teraz dokładnie, która transakcja wygrywa, ale któraś wygrywa i jest "akceptowana", zaś pozostałe są anulowane. Jeśli natomiast dane ze sobą nie kolidują, obie transakcje przechodzą.

Ogólnie transakcje to najpewniejszy sposób zapobiegania powstawaniu nieścisłości w bazie danych z powodu tego, że jakaś grupa zapytań nie wykonała się poprawnie do końca. Zostały one tak zaprojektowane, by takim sytuacjom zapobiegać. Niestety, w przypadku MySQL-a do ich stosowania jest niezbędne użycie InnoDB zamiast MyISAM.
sowiq
Cytat(Black-Berry @ 4.03.2009, 13:28:51 ) *
Druga sprawa jaka mnie martwi to czy powinno się ustawiać LOCK na tabeli przed rozpoczęciem transakcji? Obawiam się o bazę mySQL która ostatnio mi się wykrzaczyła z niewyjaśnionych przyczyn.
Według mnie to baza danych powinna o to zadbać. Jeśli robisz kilka SELECT'ów, to wykonują się one po kolei.
Jeśli wysyłasz na raz dwa zapytania, np. INSERT i SELECT, to baza danych zadba o to, żeby podczas operacji INSERT tabelka była zablokowana. Czyli zapytanie SELECT wykona się chwilkę później. Dla Ciebie, jako programisty PHP nie ma to zbytniego znaczenia, bo Ty wysyłasz zapytanie i czekasz na odpowiedź z wynikiem.

Jeśli nabredziłem, to mnie poprawcie.
Black-Berry
@Zyx Dzieki za wyczerpującą odpowiedź. Trochę mnie to uspokoiło.

Acha... piszesz że któraś transakcja wygrywa a pozostałe są anulowane... Czy jeśli nałożę LOCK przed transakcją to mam pewność że żadna nie zostanie anulowana bo będą poprostu czekać w kolejce ?

Bardzo bym nie chciał żeby jakaś transakcja była anulowana bez mojej wiedzy tylko dlatego że weszłą drugiej w drogę z powodu wielowątkowości skryptów PHP. Chciałbym aby baza najpierw kazała czekać nowym transakcjom a dopiero w ostateczności dokonywała anulowania.
Zyx
Bez Twojej wiedzy to się tak znowu nie dzieje - skrypt dostaje wtedy stosowną informację i może zareagować tongue.gif. Ogólnie, jeśli tylko jest to możliwe, baza stara się jednak wykonać równolegle dwie transakcje, przy czym one nie widzą nawzajem swoich poczynań, dopóki się nie wykonają do samego końca. W przypadku transakcji masz też możliwość blokowania na poziomie pojedynczych wierszy, a nie całych tabel. Przykładowo, jeśli pobierasz dane zapytaniem SELECT i później na ich podstawie robisz INSERT, to takie dwie transakcje mogą się spokojnie wykonać równolegle, ale mogą dać złe wyniki (np. doda się dwukrotnie to samo). Wtedy możesz do SELECT dodać słowa FOR UPDATE i wtedy dwie transakcje będą mogły wykonać się tylko wtedy, jeśli nie będą operować na tych samych wierszach - w przeciwnym wypadku jedna zaczeka na drugą.

Oczywiście w przypadku sekcji krytycznych można zablokować całą tabelę przed wejściem w transakcję, nie ma przeciwko temu żadnych przeciwwskazań - oznacza to, że blokowanie oraz transakcje mogą się uzupełniać, jeśli zachodzi potrzeba.
Orkan
dodam tylko ze tabele moga byc blokowane np. wylacznie do zapisu, wiec zaden select z innego wątku nie zostanie zablokowany.

ja mialem z tym LOCKiem problem kiedy potrzebowalem dodatkowej kolumny z warunkowym auto_increment wyliczanym na podstawie istniejacych rekordow.
kilku uzytkownikow mi zglaszalo ze dostawali errory z mysql'a kiedy chcieli zapisywac cos do bazy.
jak zmienilem na "LOCK TABLE $db_table WRITE" to bledow jest mniej, ale dalej sporadycznie sie zdarzaja...
Black-Berry
@Orkan Czy nie miałeś czegoś zle zaprojektowanego? Moim zdaniem błędy nie powinny sie zdarzać nigdy.
Orkan
Pewnie mozna by cos ulepszyc i sprawdzac przed zapisem czy tabela jest potraktowana LOCKiem czy nie.
Mowie tylko, ze w moim przykladzie (tabela MyISAM) PHP nie czeka az tabela zostanie odblokowana, tylko wywala normalnego errora ze nie mozna zapisac...
Black-Berry
No to w takiem razie mamy nieścisłość w stosunku do tego co napisał Zyx. Bardzo mnie to martwi :|
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.