Bezbolesne Programowanie Współbieżne

Wielkość: px
Rozpocząć pokaz od strony:

Download "Bezbolesne Programowanie Współbieżne"

Transkrypt

1 Bezbolesne Programowanie Współbieżne Konrad Siek 26 III 2014

2 Lata 90-te???

3 Częstotliwość procesorów Tranzystory Rok

4 Lata 90-te My new computer s got the clocks, it rocks, but it was obsolete before I opened the box. You say you ve had your desktop for over a week? Throw that junk away, man, it s an antique. Your laptop is a month old? Well, that s great. If you could use a nice, heavy paperweight... It s all about the Pentiums, Weird Al, 1999

5 Częstotliwość procesorów Taktowanie [MHz] Rok

6 Prawo Moore-a in action Tranzystory 0.0e e Rok

7 Liczby rdzeni w procesorach Rdzenie Rok

8 Od rdzeni Współbieżność

9 Od rdzeni Współbieżność... ale współbieżność boli

10 ... boli?

11 Rzeczy których nie lubie Szukanie bugów (bagów?) Wrzucanie kodu strukturalnego do funkcjonalnego Rozwiązywanie problemów synchronizacji

12 Rzeczy których nie lubie Szukanie bugów (bagów?) Wrzucanie kodu strukturalnego do funkcjonalnego Rozwiązywanie problemów synchronizacji

13 Rzeczy których nie lubie Szukanie Heisenbugów Wrzucanie kodu strukturalnego do funkcjonalnego Rozwiązywanie problemów synchronizacji

14 Heisenbug

15 Rzeczy których nie lubie Szukanie Heisenbugów Wrzucanie kodu strukturalnego do funkcjonalnego Rozwiązywanie problemów synchronizacji

16 Rzeczy których nie lubie Szukanie Heisenbugów Wrzucanie kodu strukturalnego do funkcjonalnego Rozwiązywanie problemów synchronizacji

17 Wrzucanie kodu strukturalnego do funkcjonalnego class Elem: def init (self, transaction, t, next): self.transaction = transaction self.t = t self.next = next _head = None def insert(transaction, t): if _head is None: _head = Elem(transaction, t, None) return elem = _head while True: if elem.t <= t: temp = Elem(elem.transaction, elem.t, elem.next) elem.transaction = transaction elem.t = t elem.next = temp return else: if elem.next: elem = elem.next else: elem.next = Elem(transaction, t, None) return

18 Wrzucanie kodu strukturalnego do funkcjonalnego from threading import RLock, Condition class Elem: def init (self, transaction, t, next): self.transaction = transaction self.t = t self.next = next _head = None _global_lock = Condition() _transaction_lock = RLock() def insert(head, transaction, t): elem = head while True: if elem.t <= t: temp = Elem(elem.transaction, elem.t, elem.next) elem.transaction = transaction elem.t = t elem.next = temp return else: if elem.next: elem = elem.next else: elem.next = Elem(transaction, t, None) return

19 Wrzucanie kodu strukturalnego do funkcjonalnego from threading import RLock, Condition class Elem: def init (self, transaction, t, next): self.transaction = transaction self.t = t self.next = next _head = None _global_lock = Condition() _transaction_lock = RLock() def insert(head, transaction, t): elem = head while True: if elem.t <= t: temp = Elem(elem.transaction, elem.t, elem.next) elem.transaction = transaction elem.t = t elem.next = temp return else: if elem.next: elem = elem.next else: elem.next = Elem(transaction, t, None) return def lock(transaction, length): _global_lock.acquire() if _head is None: acquired = _transaction_lock.acquire(blocking=false) if acquired and _head is None: _global_lock.release() return else: if _head == null: _head = Elem(T, t, null) else: insert(_head, T, t) while True: _global_lock.wait() if _head.t = T: _transaction_lock.acquire() if _head is not None: _head = _head.next _global_lock.release() return else: _global_lock.notify() def unlock(): _global_lock.acquire() _transaction_lock.release() _global_lock.notify() _global_lock.release() return

20 Rzeczy których nie lubie Szukanie Heisenbugów Wrzucanie kodu strukturalnego do funkcjonalnego Rozwiązywanie problemów synchronizacji

21 Rzeczy których nie lubie Szukanie Heisenbugów Wrzucanie kodu strukturalnego do funkcjonalnego Rozwiązywanie problemów synchronizacji

22 Rozwiązywanie problemów synchronizacji

23 Rozwiązywanie problemów synchronizacji

24 Rzeczy których nie lubie Szukanie Heisenbugów Wrzucanie kodu strukturalnego do funkcjonalnego Rozwiązywanie problemów synchronizacji

25 Rzeczy których nie lubie Szukanie Heisenbugów Wrzucanie kodu strukturalnego do funkcjonalnego Rozwiązywanie 2 problemów jednocześnie

26 Rozwiązania których szukam Szukanie Heisenbugów Wrzucanie kodu strukturalnego do funkcjonalnego Rozwiązywanie 2 problemów jednocześnie

27 Rozwiązania których szukam Szukanie Heisenbugów Wrzucanie kodu strukturalnego do funkcjonalnego Rozwiązywanie 2 problemów jednocześnie Uniwersalne

28 Rozwiązania którzych szukam Szukanie Heisenbugów Wrzucanie kodu strukturalnego do funkcjonalnego Proste w implementacji Rozwiązywanie 2 problemów jednocześnie Uniwersalne

29 Rozwiązania których szukam Szukanie Heisenbugów Bezbłędne Wrzucanie kodu strukturalnego do funkcjonalnego Proste w implementacji Rozwiązywanie 2 problemów jednocześnie Uniwersalne

30 Rozwiązania których szukam Szukanie Heisenbugów Bezbłędne Wrzucanie kodu strukturalnego do funkcjonalnego Proste w implementacji Rozwiązywanie 2 problemów jednocześnie Uniwersalne Wydajne

31 Rozwiązania

32 Globalny zamek from threading import Thread, Lock _global_lock = Lock() _shared_data = [0, 0, 0, 0] class GLThread (Thread): def init (self, data, index): Thread. init (self) self.index = index self.data = data def run(self): with _global_lock: self.data[self.index] += 1 my_data = self.data[self.index] print( set, self.index, to, my_data) for i in range(0, 10): GLThread(_shared_data, i % len(_shared_data)).start()

33 Globalny zamek from threading import Thread, Lock _global_lock = Lock() _shared_data = [0, 0, 0, 0] class GLThread (Thread): def init (self, data, index): Thread. init (self) self.index = index self.data = data def run(self): with _global_lock: self.data[self.index] += 1 my_data = self.data[self.index] print( set, self.index, to, my_data) for i in range(0, 10): GLThread(_shared_data, i % len(_shared_data)).start()

34 Globalny zamek Bezbolesna współbieżność

35 Globalny zamek Bezbolesna współbieżność

36 Globalny zamek Bezbolesna współbieżność

37 Wątki funkcyjne

38 Duplikaty

39 Duplikaty from hashlib import md5 hashes = [None] * len(files) def make_hash(i): source = open(files[i], rb ) data = source.read() source.close() hashes[i] = md5(data).digest() for i in range(0, len(files)): make_hash(i)

40 Duplikat from hashlib import md5 from _thread import start_new_thread # python2: thread hashes = [None] * len(files) def make_hash(i): source = open(files[i], rb ) data = source.read() source.close() hashes[i] = md5(data).digest() for i in range(0, len(files)): start_new_thread(function=make_hash, args=(i,))

41 Duplikat from hashlib import md5 from _thread import start_new_thread # python2: thread hashes = [None] * len(files) def make_hash(i): source = open(files[i], rb ) data = source.read() source.close() hashes[i] = md5(data).digest() for i in range(0, len(files)): start_new_thread(function=make_hash, args=(i,))

42 Global Interpreter Lock A global interpreter lock (GIL) is used internally to ensure that only one thread runs in the Python VM at a time. In general, Python offers to switch among threads only between bytecode instructions; how frequently it switches can be set via sys.setswitchinterval(). Each bytecode instruction and therefore all the C implementation code reached from each instruction is therefore atomic from the point of view of a Python program.

43 Duplikaty from hashlib import md5 #from _thread import start_new_thread # python2: thread from multiprocessing import Process hashes = [None] * len(files) def make_hash(i): source = open(files[i], rb ) data = source.read() source.close() hashes[i] = md5(data).digest() for i in range(0, len(files)): #start_new_thread(function=make_hash, args=(i,)) Process(target=make_hash, args=(i,)).start()

44 Duplikaty from hashlib import md5 from multiprocessing import Process hashes = [None] * len(files) def make_hash(i): source = open(files[i], rb ) data = source.read() source.close() hashes[i] = md5(data).digest() for i in range(0, len(files)): Process(target=make_hash, args=(i,)).start()

45 Duplikaty

46 Duplikaty

47 Duplikaty from hashlib import md5 from multiprocessing import Process hashes = [None] * len(files) def make_hash(i): source = open(files[i], rb ) data = source.read() source.close() hashes[i] = md5(data).digest() for i in range(0, len(files)): Process(target=make_hash, args=(i,)).start()

48 Duplikaty from hashlib import md5 from multiprocessing import Pool hashes = [None] * len(files) def make_hash(i): with semaphore: source = open(files[i], rb ) data = source.read() source.close() hashes[i] = md5(data).digest() pool = Pool(processes=4) # define after make_hash for i in range(0, len(files)): pool.apply_async(func=make_hash, args=(i,))

49 Duplikaty from hashlib import md5 from multiprocessing import Pool hashes = [None] * len(files) def make_hash(i): source = open(files[i], rb ) data = source.read() source.close() hashes[i] = md5(data).digest() pool = Pool(processes=4) # define after make_hash for i in range(0, len(files)): pool.apply_async(func=make_hash, args=(i,)) pool.close() # close before joining pool.join()

50 Wątki funkcyjne Preferują solipsyzm

51 Wątki funkcyjne Preferują solipsyzm tylko odczyt bez konfliktów

52 Wątki funkcyjne Preferują solipsyzm tylko odczyt bez konfliktów Niski koszt

53 Wątki funkcyjne Preferują solipsyzm tylko odczyt bez konfliktów Niski koszt ten sam schemat <10 lini kodu

54 Wątki funkcyjne Preferują solipsyzm tylko odczyt bez konfliktów Niski koszt ten sam schemat <10 lini kodu Znaczna poprawa efektywności

55 Wątki funkcyjne (Python) from hashlib import md5 from multiprocessing import Pool hashes = [None] * len(files) def make_hash(i): source = open(files[i], rb ) data = source.read() source.close() hashes[i] = md5(data).digest() pool = Pool(processes=4) # define after make_hash for i in range(0, len(files)): pool.apply_async(func=make_hash, args=(i,)) pool.close() # close before joining pool.join()

56 Wątki funkcyjne (Python) map from hashlib import md5 from multiprocessing import Pool hashes = [None] * len(files) def make_hash(i): source = open(files[i], rb ) data = source.read() source.close() hashes[i] = md5(data).digest() pool = Pool(processes=4) # define after make_hash pool.map(func=make_hash, iterable=range(0, len(files)))

57 Pamięć transakcyjna

58 Pamięć transakcyjna

59 Pamięć transakcyjna

60 Pamięć transakcyjna

61 Pamięć transakcyjna

62 Pamięć transakcyjna

63 Pamięć transakcyjna

64 Pamięć transakcyjna

65 Pamięć transakcyjna

66 Pamięć transakcyjna

67 Pamięć transakcyjna Python: Kamaelia/Axon ( Durus ( Java Deuce STM ( C SXM (research.microsoft.com) C/C++ wbudowana w GCC (gcc.gnu.org/wiki/transactionalmemory)

68 Bank

69 Bank ACCOUNTS = 10 TRANSFERS = 10 ids = ["id_" + str(i) for i in range(0, ACCOUNTS)] accounts = {}

70 Bank ACCOUNTS = 10 TRANSFERS = 10 ids = ["id_" + str(i) for i in range(0, ACCOUNTS)] accounts = {} def init(ids, sum): for i in ids: accounts[i] = sum def total(ids): total = 0 for i in ids: total += accounts[i] return total def transfer(a, b, sum): accounts[a] -= sum accounts[b] += sum

71 Bank from random import choice, randint ACCOUNTS = 10 TRANSFERS = 10 ids = ["id_" + str(i) for i in range(0, ACCOUNTS)] accounts = {} def init(ids, sum): for i in ids: accounts[i] = sum init(ids, 1000) for i in range(0, TRANSFERS): a = choice(ids) b = choice(filter(lambda x: x!= a, ids)) sum = randint(1, 5) * 100 transfer(a, b, sum) print total(ids) def total(ids): total = 0 for i in ids: total += accounts[i] return total def transfer(a, b, sum): accounts[a] -= sum accounts[b] += sum

72 Bank from random import choice, randint ACCOUNTS = 10 TRANSFERS = 10 ids = ["id_" + str(i) for i in range(0, ACCOUNTS)] accounts = {} def init(ids, sum): # transaction start for i in ids: accounts[i] = sum # transaction end init(ids, 1000) for i in range(0, TRANSFERS): a = choice(ids) b = choice(filter(lambda x: x!= a, ids)) sum = randint(1, 5) * 100 # fork process transfer(a, b, sum) # join processes print total(ids) def total(ids): # transaction start total = 0 for i in ids: total += accounts[i] # transaction end return total def transfer(a, b, sum): # transaction start accounts[a] -= sum accounts[b] += sum # transaction end

73 Bank from random import choice, randint from multiprocessing import Pool ACCOUNTS = 10 TRANSFERS = 10 ids = ["id_" + str(i) for i in range(0, ACCOUNTS)] accounts = {} def init(ids, sum): # transaction start for i in ids: accounts[i] = sum # transaction end init(ids, 1000) for i in range(0, TRANSFERS): a = choice(ids) b = choice(filter(lambda x: x!= a, ids)) sum = randint(1, 5) * 100 pool.apply_async(func=transfer, args=(a,b,sum)) pool.close() pool.join() print total(ids) def total(ids): # transaction start total = 0 for i in ids: total += accounts[i] # transaction end return total def transfer(a, b, sum): # transaction start accounts[a] -= sum accounts[b] += sum # transaction end

74 Bank from random import choice, randint from multiprocessing import Pool from durus.connection import Connection from durus.client_storage import ClientStorage ACCOUNTS = 10 TRANSFERS = 10 ids = ["id_" + str(i) for i in range(0, ACCOUNTS)] accounts = {} def init(ids, sum): # transaction start for i in ids: accounts[i] = sum # transaction end init(ids, 1000) for i in range(0, TRANSFERS): a = choice(ids) b = choice(filter(lambda x: x!= a, ids)) sum = randint(1, 5) * 100 pool.apply_async(func=transfer, args=(a,b,sum)) pool.close() pool.join() print total(ids) def total(ids): # transaction start total = 0 for i in ids: total += accounts[i] # transaction end return total def transfer(a, b, sum): # transaction start accounts[a] -= sum accounts[b] += sum # transaction end

75 Bank from random import choice, randint from multiprocessing import Pool from durus.connection import Connection from durus.client_storage import ClientStorage ACCOUNTS = 10 TRANSFERS = 10 ids = ["id_" + str(i) for i in range(0, ACCOUNTS)] accounts = {} def init(ids, sum): transaction = Connection(ClientStorage()) accounts = transaction.get_root() for i in ids: accounts[i] = sum transaction.commit() def total(ids): transaction = Connection(ClientStorage()) accounts = transaction.get_root() total = 0 for i in ids: total += accounts[i] transaction.commit() def transfer(a, b, sum): transaction = Connection(ClientStorage()) accounts = transaction.get_root() accounts[a] -= sum accounts[b] += sum transaction.commit() init(ids, 1000) for i in range(0, TRANSFERS): a = choice(ids) b = choice(filter(lambda x: x!= a, ids)) sum = randint(1, 5) * 100 pool.apply_async(func=transfer, args=(a,b,sum)) pool.close() pool.join() print total(ids) return total

76 Bank from random import choice, randint from multiprocessing import Pool from durus.connection import Connection from durus.client_storage import ClientStorage, ConflictError ACCOUNTS = 10 TRANSFERS = 10 ids = ["id_" + str(i) for i in range(0, ACCOUNTS)] accounts = {} def init(ids, sum): transaction = Connection(ClientStorage()) accounts = transaction.get_root() for i in ids: accounts[i] = sum transaction.commit() def total(ids): transaction = Connection(ClientStorage()) accounts = transaction.get_root() total = 0 for i in ids: total += accounts[i] transaction.commit() return total def transfer(a, b, sum): transaction = Connection(ClientStorage()) accounts = transaction.get_root() try: accounts[a] -= sum accounts[b] += sum transaction.commit() except ConflictError: transaction.abort() init(ids, 1000) for i in range(0, TRANSFERS): a = choice(ids) b = choice(filter(lambda x: x!= a, ids)) sum = randint(1, 5) * 100 pool.apply_async(func=transfer, args=(a,b,sum)) pool.close() pool.join() print total(ids)

77 Bank from random import choice, randint from multiprocessing import Pool from durus.connection import Connection from durus.client_storage import ClientStorage, ConflictError ACCOUNTS = 10 TRANSFERS = 10 ids = ["id_" + str(i) for i in range(0, ACCOUNTS)] accounts = {} def init(ids, sum): transaction = Connection(ClientStorage()) accounts = transaction.get_root() for i in ids: accounts[i] = sum transaction.commit() def total(ids): transaction = Connection(ClientStorage()) accounts = transaction.get_root() total = 0 for i in ids: total += accounts[i] transaction.commit() return total def transfer(a, b, sum): transaction = Connection(ClientStorage()) accounts = transaction.get_root() while True: try: accounts[a] -= sum accounts[b] += sum transaction.commit() return except ConflictError: transaction.abort() init(ids, 1000) for i in range(0, TRANSFERS): a = choice(ids) b = choice(filter(lambda x: x!= a, ids)) sum = randint(1, 5) * 100 pool.apply_async(func=transfer, args=(a,b,sum)) pool.close() pool.join() print total(ids)

78

79 Bank class Transaction (Process): def init (self, f, args, kwargs={}): Process. init (self) self._f, self._a, self._kw = f, args, kwargs self.ppipe, self.pipe = Pipe() self._returned, self._result = False, None def run(self): transaction = Connection(ClientStorage()) while True: try: memory = transaction.get_root() result = self._f(memory, *self._a, **self._kw) transaction.commit() self.pipe.send(result) self.pipe.close() break except ConflictError: transaction.abort() def result(self): if not self._returned: self._result = self.ppipe.recv() self._returned = True return self._result

80 Bank class Transaction (Process): def init (self, f, args, kwargs={}): Process. init (self) self._f, self._a, self._kw = f, args, kwargs self.ppipe, self.pipe = Pipe() self._returned, self._result = False, None def run(self): transaction = Connection(ClientStorage()) while True: try: memory = transaction.get_root() result = self._f(memory, *self._a, **self._kw) transaction.commit() self.pipe.send(result) self.pipe.close() break except ConflictError: transaction.abort() def result(self): if not self._returned: self._result = self.ppipe.recv() self._returned = True return self._result # pool = Pool(processes=4) # pool = Pool(processes=4, initializer=transaction) t = Transaction(init, (ids, 1000)) t.start() t.join() ts = [] for i in range(0, TRANSFERS): #... t = Transaction(transfer, (a,b,sum)) # pool.apply_async(func=t.start) t.start() ts.append(t) for t in ts: t.join() t = Transaction(total, (ids,)) t.start() t.join() print t.result()

81 Bank class Transaction (Process): def init (self, f, args, kwargs={}): Process. init (self) self._f, self._a, self._kw = f, args, kwargs self.ppipe, self.pipe = Pipe() self._returned, self._result = False, None def run(self): transaction = Connection(ClientStorage()) while True: try: memory = transaction.get_root() result = self._f(memory, *self._a, **self._kw) transaction.commit() self.pipe.send(result) self.pipe.close() break except ConflictError: transaction.abort() def result(self): if not self._returned: self._result = self.ppipe.recv() self._returned = True return self._result # pool = Pool(processes=4) # pool = Pool(processes=4, initializer=transaction) t = Transaction(init, (ids, 1000)) t.start() t.join() ts = [] for i in range(0, TRANSFERS): #... t = Transaction(transfer, (a,b,sum)) # pool.apply_async(func=t.start) t.start() ts.append(t) for t in ts: t.join() t = Transaction(total, (ids,)) t.start() t.join() print t.result()

82 Bank def transaction(f, a, kw={}): transaction = Connection(ClientStorage()) while True: try: memory = transaction.get_root() result = f(memory, *a, **kw) transaction.commit() return result except ConflictError: transaction.abort()

83 Bank from random import choice, randint from multiprocessing import Pool from durus.connection import Connection from durus.client_storage import ClientStorage, ConflictError ACCOUNTS = 10 TRANSFERS = 10 def total(ids): def _total(accounts, ids): total = 0 for i in ids: total += accounts[i] return total return transaction(_total, (ids,)) ids = ["id_" + str(i) for i in range(0, ACCOUNTS)] accounts = {} def transaction(f, a, kw={}): transaction = Connection(ClientStorage()) while True: try: memory = transaction.get_root() result = f(memory, *a, **kw) transaction.commit() return result except ConflictError: transaction.abort() def init(ids, sum): def _init(accounts, ids, sum): for i in ids: accounts[i] = sum return transaction(_init, (ids, sum,)) def transfer(a, b, sum): def _transfer(accounts, a, b, sum): accounts[a] -= sum accounts[b] += sum return transaction(_transfer, (a, b, sum)) init(ids, 1000) for i in range(0, TRANSFERS): a = choice(ids) b = choice(filter(lambda x: x!= a, ids)) sum = randint(1, 5) * 100 pool.apply_async(func=transfer, args=(a,b,sum)) pool.close() pool.join() print total(ids)

84 Pamięć transakcyjna Optymistyczna

85 Pamięć transakcyjna Optymistyczna czynności są powtarzane jeśli są konflikty czuła na liczbę transakcji i zasobow extra kod

86 Pamięć transakcyjna Optymistyczna czynności są powtarzane jeśli są konflikty czuła na liczbę transakcji i zasobow extra kod Uniwersalność

87 Pamięć transakcyjna Optymistyczna czynności są powtarzane jeśli są konflikty czuła na liczbę transakcji i zasobow extra kod Uniwersalność ten sam schemat rozwiązuje większość problemów

88 Pamięć transakcyjna Optymistyczna czynności są powtarzane jeśli są konflikty czuła na liczbę transakcji i zasobow extra kod Uniwersalność ten sam schemat rozwiązuje większość problemów Poprawa efektywności

89 Pamięć transakcyjna Optymistyczna czynności są powtarzane jeśli są konflikty czuła na liczbę transakcji i zasobow extra kod Uniwersalność ten sam schemat rozwiązuje większość problemów Poprawa efektywności (jeśli nie ma dużo konfliktów)

90 Pamięć transakcyjna Optymistyczna czynności są powtarzane jeśli są konflikty czuła na liczbę transakcji i zasobow extra kod Uniwersalność ten sam schemat rozwiązuje większość problemów Poprawa efektywności (jeśli nie ma dużo konfliktów) Akcje muszą dać się powtarzać (i nie mogą mieć nieodwracalnych efektów)

91 Bank // Deuce STM // compile with -javaagent:bin/deuceagent.jar public class Bank { public static final int TRANSFERS = 10; public static final int ACCOUNTS = 100; } private final double[] accounts = new double[accounts]; public Bank() { for (int i = 0; i < accounts.length; i++) { accounts[i] = 200; } public void total() { double total = 0d; for (int i = 0; i < accounts.length; i++) { total += accounts[i]; } public void transfer(int a, int b, double sum) { accounts[a] -= sum; accounts[b] += sum; } public static void main(string[] args) { final Random random = new Random(); final Bank bank = new Bank(); List<Thread> transactions = new LinkedList<Thread>(); } for (int i = 0; i < Bank.TRANSFERS; i++) { final int a = random.nextint(bank.accounts); final int b = random.nextint(bank.accounts); final double sum = 5d + random.nextdouble() % 15d; Thread t = new Thread() { public void run() { bank.transfer(a, b, sum); } }; t.start(); transactions.add(t); } Thread t = new Thread() { public void run() { bank.total(); } }; t.start(); transactions.add(t); for (Thread thread : transactions) { thread.join(); }

92 Bank from random import choice, randint from multiprocessing import Pool from durus.connection import Connection from durus.client_storage import ClientStorage, ConflictError ACCOUNTS = 10 TRANSFERS = 10 def total(ids): def _total(accounts, ids): total = 0 for i in ids: total += accounts[i] return total return transaction(_total, (ids,)) ids = ["id_" + str(i) for i in range(0, ACCOUNTS)] accounts = {} def transaction(f, a, kw={}): transaction = Connection(ClientStorage()) while True: try: memory = transaction.get_root() result = f(memory, *a, **kw) transaction.commit() return result except ConflictError: transaction.abort() def init(ids, sum): def _init(accounts, ids, sum): for i in ids: accounts[i] = sum return transaction(_init, (ids, sum,)) def transfer(a, b, sum): def _transfer(accounts, a, b, sum): accounts[a] -= sum accounts[b] += sum return transaction(_transfer, (a, b, sum)) init(ids, 1000) for i in range(0, TRANSFERS): a = choice(ids) b = choice(filter(lambda x: x!= a, ids)) sum = randint(1, 5) * 100 pool.apply_async(func=transfer, args=(a,b,sum)) pool.close() pool.join() print total(ids)

93 Bank from random import choice, randint from multiprocessing import Pool from durus.connection import Connection from durus.client_storage import ClientStorage, ConflictError ACCOUNTS = 10 TRANSFERS = 10 def total(ids): def _total(accounts, ids): total = 0 for i in ids: total += accounts[i] return total return transaction(_total, (ids,)) ids = ["id_" + str(i) for i in range(0, ACCOUNTS)] accounts = {} def transaction(f, a, kw={}): transaction = Connection(ClientStorage()) while True: try: memory = transaction.get_root() result = f(memory, *a, **kw) transaction.commit() return result except ConflictError: transaction.abort() def init(ids, sum): def _init(accounts, ids, sum): for i in ids: accounts[i] = sum return transaction(_init, (ids, sum,)) def transfer(a, b, sum): def _transfer(accounts, a, b, sum): ask_user_for_authentication(a, b, sum) if _: accounts[a] -= sum accounts[b] += sum return transaction(_transfer, (a, b, sum)) init(ids, 1000) for i in range(0, TRANSFERS): a = choice(ids) b = choice(filter(lambda x: x!= a, ids)) sum = randint(1, 5) * 100 pool.apply_async(func=transfer, args=(a,b,sum)) pool.close() pool.join() print total(ids)

94 Globalny zamek!

95 Globalny zamek!

96 Posortowane zamki Pesymistyczne transakcje

97 Ale zamki są trudne?

98 Tak Ale zamki są trudne?

99 Ale zamki są trudne? Tak... ale dlaczego?

100 Ale zamki są trudne? Tak... ale dlaczego? Deadlock

101 Ale zamki są trudne? Tak... ale dlaczego? Deadlock Pamiętanie który zamek jest do czego i kompozycyjność

102 Ale zamki są trudne? Tak... ale dlaczego? Deadlock Pamiętanie który zamek jest do czego i kompozycyjność Dodatkowy kod

103 Ale zamki są trudne? Tak... ale dlaczego? Deadlock Pamiętanie który zamek jest do czego i kompozycyjność Dodatkowy kod zamknąć zamki w transakcje

104 Ale zamki są trudne? Tak... ale dlaczego? Deadlock Pamiętanie który zamek jest do czego i kompozycyjność po jednym zamku na obiekt współdzielony Dodatkowy kod zamknąć zamki w transakcje

105 Ale zamki są trudne? Tak... ale dlaczego? Deadlock sortowanie zamków, 2PL Pamiętanie który zamek jest do czego i kompozycyjność po jednym zamku na obiekt współdzielony Dodatkowy kod zamknąć zamki w transakcje

106 Posortowane zamki

107 Posortowane zamki

108 Posortowane zamki

109 Posortowane zamki

110 Posortowane zamki

111 Posortowane zamki

112 Posortowane zamki from multiprocessing import Lock accounts, locks = {}, {} for i in range(0, ACCOUNTS): accounts[i] = 200 locks[i] = Lock() def transfer(a, b, sum): _locks = [locks[a], locks[b]] _locks.sort(key = lambda x: str(x)) for lock in _locks: lock.acquire() accounts[a] -= sum locks[a].release() accounts[b] += sum locks[b].release()

113 Kiedy czego używać? Wątki funcyjne

114 Kiedy czego używać? Wątki funcyjne niezależne zadania

115 Kiedy czego używać? Wątki funcyjne niezależne zadania Transakcje

116 Kiedy czego używać? Wątki funcyjne niezależne zadania Transakcje wszystko co można powtarzać, bez bardzo dużej konkurencji o zasoby

117 Kiedy czego używać? Wątki funcyjne niezależne zadania Transakcje wszystko co można powtarzać, bez bardzo dużej konkurencji o zasoby Posortowane zamki

118 Kiedy czego używać? Wątki funcyjne niezależne zadania Transakcje wszystko co można powtarzać, bez bardzo dużej konkurencji o zasoby Posortowane zamki wszystko czego nie można powtarzać

119 Kiedy czego używać? Wątki funcyjne niezależne zadania Transakcje wszystko co można powtarzać, bez bardzo dużej konkurencji o zasoby Posortowane zamki wszystko czego nie można powtarzać Globalny zamek

120 Kiedy czego używać? Wątki funcyjne niezależne zadania Transakcje wszystko co można powtarzać, bez bardzo dużej konkurencji o zasoby Posortowane zamki wszystko czego nie można powtarzać Globalny zamek najlepiej nigdy

121 Kiedy czego używać? Wątki funcyjne niezależne zadania Transakcje wszystko co można powtarzać, bez bardzo dużej konkurencji o zasoby Posortowane zamki wszystko czego nie można powtarzać Globalny zamek najlepiej nigdy

122 Koło Naukowe SKiSR Koło Naukowe SKiSR

123 Koło Naukowe SKiSR Koło Naukowe SKiSR

Zaawansowany kurs języka Python

Zaawansowany kurs języka Python Wykład 6. 6 listopada 2015 Plan wykładu Callable objects 1 Callable objects 2 3 Plan wykładu Callable objects 1 Callable objects 2 3 Callable objects Wszystko jest obiektem. Callable objects Wszystko jest

Bardziej szczegółowo

Wątki i komunikacja między nimi w języku Python

Wątki i komunikacja między nimi w języku Python Wątki i komunikacja między nimi w języku Python Czyli kolejny poziom abstrakcji. Michał Mazurek mazurek.michal@gmail.com http://www.ifresearch.pl January 14, 2008 Python? A co to? Python Interpretowany,

Bardziej szczegółowo

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1 Współbieżność i równoległość w środowiskach obiektowych Krzysztof Banaś Obliczenia równoległe 1 Java Model współbieżności Javy opiera się na realizacji szeregu omawianych dotychczas elementów: zarządzanie

Bardziej szczegółowo

Kurs rozszerzony języka Python

Kurs rozszerzony języka Python Wykład 6. 10 listopada 2017 Plan wykładu 1 2 3 Plan wykładu 1 2 3 Wszystko jest obiektem. Wszystko jest obiektem. A funkcje? Przykład def foo(x): return 2*x dir(foo) Przykład def foo(x): return 2*x dir(foo)

Bardziej szczegółowo

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ Procesy i wątki Proces posiada samodzielne środowisko wykonawcze. Proces posiada własny zestaw podstawowych zasobów w czasie wykonywania; W szczególności, każdy proces ma własną przestrzeń pamięci. W uproszczeniu

Bardziej szczegółowo

Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki Programowanie w Sieci Internet Python: Wątki Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki Wątki akt pierwszy, kilka przydatnych funkcji Lib/threading.py modół pozwalający

Bardziej szczegółowo

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run(). Wątki Streszczenie Celem wykładu jest wprowadzenie do obsługi wątków w Javie. Czas wykładu 45 minut. Definiowanie wątków jako klas potomnych Thread Nadpisanie metody run(). class Watek extends Thread public

Bardziej szczegółowo

Java. Programowanie Obiektowe Mateusz Cicheński

Java. Programowanie Obiektowe Mateusz Cicheński Java Programowanie Obiektowe Mateusz Cicheński Wielowątkowość Proces a wątek? Thread vs Runnable sleep(), interrupt(), join() Problemy wielowątkowości Obiekty niemodyfikowalne (immutable) Serializacja

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Wykład 2: Wstęp do języka Java 3/4/2013 S.Deniziak: Programowanie obiektowe - Java 1 Cechy języka Java Wszystko jest obiektem Nie ma zmiennych globalnych Nie ma funkcji globalnych

Bardziej szczegółowo

Kurs języka Python. Wątki

Kurs języka Python. Wątki Kurs języka Python Wątki Wątek Wątek (ang. thread) to jednostka wykonawcza w obrębie jednego procesu, będąca kolejnym ciągiem instrukcji wykonywanym w obrębie tych samych danych (w tej samej przestrzeni

Bardziej szczegółowo

WSPÓŁBIEŻNOŚĆ. MATERIAŁY:

WSPÓŁBIEŻNOŚĆ. MATERIAŁY: WSPÓŁBIEŻNOŚĆ ZAGADNIENIA: procesy, wątki, synchronizacja, synchronizacja w Java 5.0 blokady, egzekutory, zbiory wątków MATERIAŁY: http://docs.oracle.com/javase/tutorial/essential/concurrency/ HTTP://USERS.UJ.EDU.PL/~CIESLA/

Bardziej szczegółowo

Plan. krótkie opisy modułów. 1 Uwagi na temat wydajności CPython a. 2 Podstawowe techniki poprawiające wydajność obliczeniową

Plan. krótkie opisy modułów. 1 Uwagi na temat wydajności CPython a. 2 Podstawowe techniki poprawiające wydajność obliczeniową Plan 1 Uwagi na temat wydajności CPython a 2 Podstawowe techniki poprawiające wydajność obliczeniową 3 Podstawowe techniki poprawiające zużycie pamięci krótkie opisy modułów 1 array - jak oszczędzić na

Bardziej szczegółowo

Języki i Techniki Programowania II. Wykład 7. Współbieżność 1

Języki i Techniki Programowania II. Wykład 7. Współbieżność 1 Języki i Techniki Programowania II Wykład 7 Współbieżność 1 Programy, Procesy, Wątki Program to zestaw instrukcji do wykonania, dane do przetworzenia, mechanizmy sterujące (stos) Proces w komputerze to

Bardziej szczegółowo

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1) MAS dr. Inż. Mariusz Trzaska Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1) Zagadnienia o Podstawy o Kontrolowanie sterowania o Klasy o Interfejsy o Obsługa błędów o Pojemniki o System

Bardziej szczegółowo

Installation of EuroCert software for qualified electronic signature

Installation of EuroCert software for qualified electronic signature Installation of EuroCert software for qualified electronic signature for Microsoft Windows systems Warsaw 28.08.2019 Content 1. Downloading and running the software for the e-signature... 3 a) Installer

Bardziej szczegółowo

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1 Współbieżność i równoległość w środowiskach obiektowych Krzysztof Banaś Obliczenia równoległe 1 Java Model współbieżności Javy opiera się na realizacji szeregu omawianych dotychczas elementów: zarządzanie

Bardziej szczegółowo

Metody Metody, parametry, zwracanie wartości

Metody Metody, parametry, zwracanie wartości Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com Metody Metody, parametry, zwracanie wartości Metody - co to jest i po co? Metoda to wydzielona część klasy, mająca

Bardziej szczegółowo

Zaawansowany kurs języka Python

Zaawansowany kurs języka Python Wykład 4. 23 października 2015 Plan wykładu 1 2 Pliki tekstowe Trwałość obiektów CSV Strumienie Plan wykładu 1 2 Pliki tekstowe Trwałość obiektów CSV Strumienie Protokół iteracyjny Producent Umiem dostarczać

Bardziej szczegółowo

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Wykład 12. Programowanie serwera MS SQL 2005 w C# Wykład 12 Programowanie serwera MS SQL 2005 w C# Budowa procedur składowanych w C# Budowa funkcji składowanych w C# Wykorzystanie funkcji składowanych w C# po stronie klienta Tworzenie typów definiowanych

Bardziej szczegółowo

Programowanie komputerów

Programowanie komputerów Programowanie komputerów Wykład 7: Programowanie wielowątkowe w Javie dr inż. Walery Susłow Współbieżność Programy współbieżne (concurrent software) aplikacje potrafiące wykonywać kilka operacji w tym

Bardziej szczegółowo

Programowanie współbieżne Laboratorium nr 11

Programowanie współbieżne Laboratorium nr 11 Programowanie współbieżne Laboratorium nr 11 Wykonywane w danym momencie programy nazwano procesami [1] - izolowanymi, niezależnie wykonywanymi programami, dla których system operacyjny przydzielał pamięć,

Bardziej szczegółowo

Zaawansowane aplikacje WWW - laboratorium

Zaawansowane aplikacje WWW - laboratorium Zaawansowane aplikacje WWW - laboratorium Przetwarzanie XML (część 2) Celem ćwiczenia jest przygotowanie aplikacji, która umożliwi odczyt i przetwarzanie pliku z zawartością XML. Aplikacja, napisana w

Bardziej szczegółowo

Programowanie współbieżne Zadanie 5 - Podstawowe problemy programowania współbieżnego

Programowanie współbieżne Zadanie 5 - Podstawowe problemy programowania współbieżnego 150875 Grzegorz Graczyk numer indeksu imię i nazwisko 151021 Paweł Tarasiuk numer indeksu imię i nazwisko Data 2011-11-07 Kierunek Informatyka Specjalizacja Inżynieria Oprgoramowania i Analiza Danych Rok

Bardziej szczegółowo

Technologie cyfrowe semestr letni 2018/2019

Technologie cyfrowe semestr letni 2018/2019 Technologie cyfrowe semestr letni 2018/2019 Tomasz Kazimierczuk Wykład 8 (15.04.2019) Kompilacja Kompilacja programu (kodu): proces tłumaczenia kodu napisanego w wybranym języku na kod maszynowy, zrozumiały

Bardziej szczegółowo

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016 Wykład 9 28 kwiecień 2016 Java Collections Framework (w C++ Standard Template Library) Kolekcja (kontener) Obiekt grupujacy/przechowuj acy jakieś elementy (obiekty lub wartości). Przykładami kolekcji sa

Bardziej szczegółowo

Programowanie funkcyjne w Pythonie

Programowanie funkcyjne w Pythonie Programowanie funkcyjne w Pythonie Koªo DSG 2013 Konrad Siek konrad.siek@cs.put.edu.pl dsg.cs.put.poznan.pl Paradygmat funkcyjny Paradygmat = sposób my±lenia o problemach Paradygmat funkcyjny Paradygmat

Bardziej szczegółowo

Wstęp. Przetwarzanie współbieżne, równoległe i rozproszone

Wstęp. Przetwarzanie współbieżne, równoległe i rozproszone Wstęp. 1 Cel zajęć Zapoznanie z technikami i narzędziami programistycznymi służącymi do tworzenia programów równoległych Przedstawienie sprzętu wykorzystywanego do obliczeń równoległych Nauczenie sposobów

Bardziej szczegółowo

Przegląd języka Python. Łukasz Anwajler

Przegląd języka Python. Łukasz Anwajler Przegląd języka Python Łukasz Anwajler lukasz.anwajler@pjwstk.edu.pl Nie wierzcie mi na słowo Zaraz zobaczymy: czym jest Python dlaczego warto go używać jakie ma zastosowania gdzie z niego korzystają jakzacząć

Bardziej szczegółowo

Współbieżność w środowisku Java

Współbieżność w środowisku Java Współbieżność w środowisku Java Wątki i ich synchronizacja Zagadnienia Tworzenie wątków Stany wątków i ich zmiana Demony Synchronizacja wątków wzajemne wykluczanie oczekiwanie na zmiennych warunkowych

Bardziej szczegółowo

Operatory. Składnia. Typy proste. Znaki specjalne

Operatory. Składnia. Typy proste. Znaki specjalne Składnia Operatory komentarze // /* */ /** */ litery A.. Z, a.. z, \udddd dddd>00c0 identyfikatory pierwszy znak= _, lub litera, następne dodatkowo 0.. 9 liczby dziesiętne Ddddd (D 0) liczby ósemkowe 0dddd

Bardziej szczegółowo

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle Pętle while, for, while, instrukcje break, continue, switch 1. Pętle Przykład 1 - Pętla while public class lab4_3 public static void main(string[] args) char ch = 'a'; String s, wynik=""; while ( ch!=

Bardziej szczegółowo

Serwer współbieżny połączeniowy

Serwer współbieżny połączeniowy Serwery współbieżne 1. Serwery współbieżne serwery połączeniowe, usuwanie zakończonych procesów, serwery bezpołączeniowe, 2. Jednoprocesowe serwery współbieżne. koncepcja i implementacja. 1 Serwer współbieżny

Bardziej szczegółowo

Programowanie w języku Java. Bazy danych SQLite w Javie

Programowanie w języku Java. Bazy danych SQLite w Javie Programowanie w języku Java Bazy danych SQLite w Javie Co to jest SQLite SQLite to bezserwerowa, nie wymagająca konfiguracji relacyjna baza danych. Znajduje szerokie zastosowanie np.. w systemie android

Bardziej szczegółowo

Wzorce logiki dziedziny

Wzorce logiki dziedziny Wzorce logiki dziedziny 1. Wzorce logiki dziedziny skrypt transakcji (Transaction Script), brama tabeli (Table Data Gateway), model dziedziny (Domain model), strategia (Strategy), moduł tabeli (Table Module),

Bardziej szczegółowo

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003 Obliczenia równoległe i rozproszone w JAVIE Michał Kozłowski 30 listopada 2003 Wątki w JAVIE Reprezentacja wątków jako obiektów Uruchamianie i zatrzymywanie wątków Realizacja wątków Ograniczenia Mechanizmy

Bardziej szczegółowo

WIELOWĄTKOWOŚĆ. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

WIELOWĄTKOWOŚĆ. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska WIELOWĄTKOWOŚĆ Waldemar Korłub Platformy Technologiczne KASK ETI Politechnika Gdańska Wydajność 2 Do 2005 roku wydajność komputerów poprawiano zwiększając częstotliwość taktowania procesora 1995: Pentium

Bardziej szczegółowo

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3 Modelowanie numeryczne w fizyce atmosfery Sylwester Arabas (ćwiczenia do wykładu dr. hab. inż. Lecha Łobockiego) Instytut Geofizyki, Wydział Fizyki Uniwersytetu Warszawskiego 3. listopada 2011 r. Schemat

Bardziej szczegółowo

Java Programowanie Obiektowe Ćwiczenie 1- wprowadzenie

Java Programowanie Obiektowe Ćwiczenie 1- wprowadzenie Java Programowanie Obiektowe Ćwiczenie 1- wprowadzenie 1. Cel ćwiczenia i zakres Poznanie środowiska IntelliJ IDEA Maven narzędzie do budowanie projektów typy podstawowe i tablice, instrukcje warunkowe,

Bardziej szczegółowo

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie Języki Programowania II Wykład 3 Java podstawy Przypomnienie Analiza, projektowanie, programowanie, testowanie, wdrażanie Iteracyjnie nie kaskadowo Przypadki użycia = opowiastki o używaniu systemu = wymagania

Bardziej szczegółowo

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1 PODSTAWOWE ELEMENTY JĘZYKA JAVA WYRAŻENIA, OPERATORY, INSTRUKCJE 1. Operatory arytmetyczne +, -, /,*, % Przykład 1 programu z interfejsem konsolowym public class Lab2_1 // Tworzy generator liczb losowych,

Bardziej szczegółowo

Signals + Threads: Qt vs. Boost

Signals + Threads: Qt vs. Boost Signals + Threads: Qt vs. Boost Adam Bujalski 2014-04-01 Adam Bujalski Signals + Threads: Qt vs. Boost 2014-04-01 1 / 22 Spis Treści 1 2 Wątki 3 Qt::QueuedConnection w boost Adam Bujalski Signals + Threads:

Bardziej szczegółowo

Kurs programowania. Wykład 9. Wojciech Macyna

Kurs programowania. Wykład 9. Wojciech Macyna Wykład 9 Java Collections Framework (w C++ Standard Template Library) Kolekcja (kontener) Obiekt grupujacy/przechowuj acy jakieś elementy (obiekty lub wartości). Przykładami kolekcji sa zbiór, lista czy

Bardziej szczegółowo

Java: interfejsy i klasy wewnętrzne

Java: interfejsy i klasy wewnętrzne Java: interfejsy i klasy wewnętrzne Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak 1 INTERFEJSY Interfejs to opis co klasa implementująca dany interfejs powinna robić, ale bez określania

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Przygotował: Jacek Sroka 1 Programowanie obiektowe Wykład 3 Java podstawy Przygotował: Jacek Sroka 2 Przypomnienie Analiza, projektowanie, programowanie, testowanie, wdrażanie Iteracyjnie nie kaskadowo

Bardziej szczegółowo

Systemy Rozproszone - Ćwiczenie 6

Systemy Rozproszone - Ćwiczenie 6 Systemy Rozproszone - Ćwiczenie 6 1 Obiekty zdalne Celem ćwiczenia jest stworzenie obiektu zdalnego świadczącego prostą usługę nazewniczą. Nazwy i odpowiadające im punkty końcowe będą przechowywane przez

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Język programowania Ruby Marcin Młotkowski 12 kwietnia 2018 Plan wykładu 1 Wstęp 2 Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy

Bardziej szczegółowo

Aplikacja wielowątkowa prosty komunikator

Aplikacja wielowątkowa prosty komunikator Aplikacja wielowątkowa prosty komunikator Klient 0 (host 1) Wątek 0 Komponent serwera Wątek pochodny 3.1 Klient 1 (host 2) Wątek 1 Komponent serwera Wątek pochodny 3.2 Host 4 Serwer Wątek 3 Klient 2 (host

Bardziej szczegółowo

Podstawy współbieżności

Podstawy współbieżności Podstawy współbieżności Algorytmy i struktury danych. Wykład 6. Rok akademicki: 2010/2011 Od koncepcji współbieżności do systemów rozproszonych Współbieżnośd rozważany na poziomie koncepcyjnym sposób realizacji

Bardziej szczegółowo

Podstawy Programowania ELEMENTY PROGRAMU i TYPY DANYCH

Podstawy Programowania ELEMENTY PROGRAMU i TYPY DANYCH Podstawy Programowania ELEMENTY PROGRAMU i TYPY DANYCH Michał Bujacz bujaczm@p.lodz.pl B9 Lodex 207 godziny przyjęć: środy i czwartki 10:00-11:00 http://www.eletel.p.lodz.pl/bujacz/ 1 Pytania weryfikacyjne:

Bardziej szczegółowo

Aplikacje w Javie- wykład 11 Wątki-podstawy

Aplikacje w Javie- wykład 11 Wątki-podstawy 1 Aplikacje w Javie- wykład 11 Wątki-podstawy Treści prezentowane w wykładzie zostały oparte o: Barteczko, JAVA Programowanie praktyczne od podstaw, PWN, 2014 http://docs.oracle.com/javase/8/docs/ http://docs.oracle.com/javase/9/docs/

Bardziej szczegółowo

Projektowanie algorytmów rekurencyjnych

Projektowanie algorytmów rekurencyjnych C9 Projektowanie algorytmów rekurencyjnych wiczenie 1. Przeanalizowa działanie poniszego algorytmu dla parametru wejciowego n = 4 (rysunek 9.1): n i i

Bardziej szczegółowo

Programowanie obiektowe i zdarzeniowe

Programowanie obiektowe i zdarzeniowe Marek Tabędzki Programowanie obiektowe i zdarzeniowe 1/23 Programowanie obiektowe i zdarzeniowe wykład 6 polimorfizm Na poprzednim wykładzie: dziedziczenie jest sposobem na utworzenie nowej klasy na podstawie

Bardziej szczegółowo

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna Język JAVA podstawy Wykład 3, część 3 1 Język JAVA podstawy Plan wykładu: 1. Konstrukcja kodu programów w Javie 2. Identyfikatory, zmienne 3. Typy danych 4. Operatory, instrukcje sterujące instrukcja warunkowe,

Bardziej szczegółowo

Model pamięci. Rafał Skinderowicz

Model pamięci. Rafał Skinderowicz Model pamięci Rafał Skinderowicz Czym jest model pamięci Model pamięci dotyczy programów współbieżnych W programie współbieżnym może się zdarzyć, że dany wątek nie będzie widział od razu wartości zmiennej

Bardziej szczegółowo

Machine Learning for Data Science (CS4786) Lecture11. Random Projections & Canonical Correlation Analysis

Machine Learning for Data Science (CS4786) Lecture11. Random Projections & Canonical Correlation Analysis Machine Learning for Data Science (CS4786) Lecture11 5 Random Projections & Canonical Correlation Analysis The Tall, THE FAT AND THE UGLY n X d The Tall, THE FAT AND THE UGLY d X > n X d n = n d d The

Bardziej szczegółowo

Wstęp do ruby dla programistów javy

Wstęp do ruby dla programistów javy czyli dlaczego java ssie Akademickie Stowarzyszenie Informatyczne 26 lutego 2011 Podstawowe cechy Ruby vs Java Wieloparadygmatowy Imperatywny Typowanie Silne Dynamiczne Otwarte klasy Interpretowany Wszystko

Bardziej szczegółowo

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017 Wykład 13 14 czerwiec 2017 Java vs cpp - podobieństwa Podobny sposób definiowania klas. Występowanie typów podstawowych: boolean, char, byte, short, int, long, float, double. Podobna zasada definiowania

Bardziej szczegółowo

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe Programowanie i projektowanie obiektowe Przykład symulacji Paweł Daniluk Wydział Fizyki Jesień 2012 P. Daniluk (Wydział Fizyki) PO w. XII Jesień 2012 1 / 18 Symulacja sieci kolejowej A B C Zasady Na torze

Bardziej szczegółowo

Dokumentacja do API Javy.

Dokumentacja do API Javy. Dokumentacja do API Javy http://java.sun.com/j2se/1.5.0/docs/api/ Klasy i obiekty Klasa jest to struktura zawierająca dane (pola), oraz funkcje operujące na tych danych (metody). Klasa jest rodzajem szablonu

Bardziej szczegółowo

www.irs.gov/form990. If "Yes," complete Schedule A Schedule B, Schedule of Contributors If "Yes," complete Schedule C, Part I If "Yes," complete Schedule C, Part II If "Yes," complete Schedule C, Part

Bardziej szczegółowo

Programowanie w języku Java. Kolekcje

Programowanie w języku Java. Kolekcje Programowanie w języku Java Kolekcje Definicja Kolekcja to obiekt, który grupuje elementy danych (inne obiekty) i pozwala traktować je jak jeden zestaw danych, umożliwiając jednocześnie wykonywanie na

Bardziej szczegółowo

Komponenty sterowane komunikatami

Komponenty sterowane komunikatami Komponenty sterowane komunikatami 1. Usługa JMS asynchroniczność, model przesyłania komunikatów, 2. Przykład wysyłanie wiadomości, odbieranie wiadomości, komponent sterowany komunikatami 3. Komponenty

Bardziej szczegółowo

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)? 1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)? public static void test1() { Object[] o = new Object[] { "1", "2", "3" ; List l = new ArrayList(Arrays.asList(o));

Bardziej szczegółowo

Wykład 4: Klasy i Metody

Wykład 4: Klasy i Metody Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to

Bardziej szczegółowo

Podstawy programowania obiektowego

Podstawy programowania obiektowego Podstawy programowania obiektowego Technologie internetowe Wykład 5 Program wykładu Podejście obiektowe kontra strukturalne do tworzenie programu Pojęcie klasy i obiektu Składowe klasy: pola i metody Tworzenie

Bardziej szczegółowo

Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0 Zofia Kruczkiewicz

Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0  Zofia Kruczkiewicz Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0 http://www.junit.org/ Zofia Kruczkiewicz 1. Aby utworzyć test dla jednej klasy, należy kliknąć prawym przyciskiem myszy w oknie Projects na wybraną

Bardziej szczegółowo

Algorytmy z powrotami. Algorytm minimax

Algorytmy z powrotami. Algorytm minimax Algorytmy z powrotami. Algorytm minimax Algorytmy i struktury danych. Wykład 7. Rok akademicki: 2010/2011 Algorytm z powrotami rozwiązanie problemu budowane jest w kolejnych krokach, po stwierdzeniu (w

Bardziej szczegółowo

Jak ujarzmić hydrę czyli programowanie równoległe w Javie. dr hab. Piotr Bała, prof. UW ICM Uniwersytet Warszawski

Jak ujarzmić hydrę czyli programowanie równoległe w Javie. dr hab. Piotr Bała, prof. UW ICM Uniwersytet Warszawski Jak ujarzmić hydrę czyli programowanie równoległe w Javie dr hab. Piotr Bała, prof. UW ICM Uniwersytet Warszawski Prawo Moore a Ekonomicznie optymalna liczba tranzystorów w układzie scalonym zwiększa się

Bardziej szczegółowo

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1 Przetwarzanie wielowątkowe przetwarzanie współbieżne Krzysztof Banaś Obliczenia równoległe 1 Problemy współbieżności wyścig (race condition) synchronizacja realizowana sprzętowo (np. komputery macierzowe)

Bardziej szczegółowo

Język Java wątki (streszczenie)

Język Java wątki (streszczenie) Programowanie współbieżna Język Java wątki (streszczenie) Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Języka Java wątki Autor:

Bardziej szczegółowo

JAVA W SUPER EXPRESOWEJ PIGUŁCE

JAVA W SUPER EXPRESOWEJ PIGUŁCE JAVA W SUPER EXPRESOWEJ PIGUŁCE Obiekt Obiekty programowe to zbiór własności i zachowań (zmiennych i metod). Podobnie jak w świecie rzeczywistym obiekty posiadają swój stan i zachowanie. Komunikat Wszystkie

Bardziej szczegółowo

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak Wieloplatformowe aplikacje sieciowe dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak SOAP Serwer: Axis2 / Java Wbudowany komponent nasłuchujący, (Apache / Tomcat) Client Axis2 klient / XML Jeżyk programowania:

Bardziej szczegółowo

DODATKOWE ĆWICZENIA EGZAMINACYJNE

DODATKOWE ĆWICZENIA EGZAMINACYJNE I.1. X Have a nice day! Y a) Good idea b) See you soon c) The same to you I.2. X: This is my new computer. Y: Wow! Can I have a look at the Internet? X: a) Thank you b) Go ahead c) Let me try I.3. X: What

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Podstawowe cechy i możliwości języka Scala mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 2017 1 / 32 mgr inż. Krzysztof Szwarc Programowanie obiektowe Informacje

Bardziej szczegółowo

Technologie cyfrowe semestr letni 2018/2019

Technologie cyfrowe semestr letni 2018/2019 Technologie cyfrowe semestr letni 2018/2019 Tomasz Kazimierczuk Wykład 7 (08.04.2019) Wikipedia Programowanie komputerów proces projektowania, tworzenia, testowania i utrzymywania kodu źródłowego programów

Bardziej szczegółowo

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Języki i metody programowania Java INF302W Wykład 2 (część 1) Języki i metody programowania Java INF302W Wykład 2 (część 1) Autor Dr inż. Zofia Kruczkiewicz Autor: Zofia Kruczkiewicz, Języki i metody programowania Java, wykład 2, część 1 1 Struktura wykładu 1. Identyfikacja

Bardziej szczegółowo

Przetwarzanie równoległe i współbieżne

Przetwarzanie równoległe i współbieżne Wątki Threads Wątki (Threads) Concurrent programming is like stepping into an entirely new world and learning a new programming language!!! (grząski grunt) Unikaj jeśli możesz rozwiazać problem! Implementacja

Bardziej szczegółowo

Wstęp. Ale po co? Implementacja

Wstęp. Ale po co? Implementacja Wstęp Mechanizm sesji jest jedną z podstawowych form komunikacji pomiędzy skryptami jako jedyna tablica z super globalnych nie jest widoczna dla użytkownika. Mimo, że PHP od wersji 4 staje się coraz bardziej

Bardziej szczegółowo

Automatyczne generowanie testów z modeli. Bogdan Bereza Automatyczne generowanie testów z modeli

Automatyczne generowanie testów z modeli. Bogdan Bereza Automatyczne generowanie testów z modeli Automatyczne generowanie testów z modeli Numer: 1 (33) Rozkmina: Projektowanie testów na podstawie modeli (potem można je wykonywać ręcznie, lub automatycznie zwykle chce się automatycznie) A ja mówię

Bardziej szczegółowo

Języki i metody programowania Java Obsługa zdarzeń - przykłady

Języki i metody programowania Java Obsługa zdarzeń - przykłady Języki i metody programowania Java Obsługa zdarzeń - przykłady wg https://docs.oracle.com/javase/tutorial/uiswing/components/ind ex.html Autor Dr inż. Zofia Kruczkiewicz Rodzaje słuchaczy zdarzeń Wydarzenia

Bardziej szczegółowo

Pierwsza ramka. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 10

Pierwsza ramka. dr Anna Łazińska, WMiI UŁ Podstawy języka Java   1 / 10 Pierwsza ramka dr Anna Łazińska, WMiI UŁ Podstawy języka Java https://www.javatpoint.com 1 / 10 Pierwsza ramka - kod package myframe1; import javax.swing.jframe; import javax.swing.jlabel; class MyFrame1

Bardziej szczegółowo

Python. Wprowadzenie. Jolanta Bachan

Python. Wprowadzenie. Jolanta Bachan Python Wprowadzenie Jolanta Bachan Zainstaluj i przetestuj Pythona https://www.python.org/downloads/ print 'Hello world!' operatory numeryczne: + - * / // % ** operatory porównania: ==!= > < >=

Bardziej szczegółowo

Wzorce dystrybucji i wspólbieżności autonomicznej

Wzorce dystrybucji i wspólbieżności autonomicznej Wzorce dystrybucji i wspólbieżności autonomicznej 1. Wzorce dystrybucji, fasada zdalna (Remote Facade), obiekt transfery danych (Data Transfer Object), 2. Wzorce współbieżności autonomicznej, blokada optymistyczna

Bardziej szczegółowo

Podstawy programowania w Pythonie

Podstawy programowania w Pythonie Podstawy programowania w Pythonie Wykład 2 dr Andrzej Zbrzezny Instytut Matematyki i Informatyki Akademia Jana Długosza w Częstochowie 10 października 2012 dr Andrzej Zbrzezny (IMI AJD) Podstawy programowania

Bardziej szczegółowo

Wykorzystywanie parsera DOM w programach Java i PL/SQL

Wykorzystywanie parsera DOM w programach Java i PL/SQL Wykorzystywanie parsera DOM w programach Java i PL/SQL Maciej Zakrzewicz mzakrz@cs.put.poznan.pl http://www.cs.put.poznan.pl/~mzakrz/ Parser DOM Aplikacja DOM API Parser DOM Dokument XML Drzewo DOM Parser

Bardziej szczegółowo

Dzi kuj za uwag! Spotkania z Pythonem. Cz ± 1 - podstawy - rozwi zania zada« Michaª Alichniewicz. Gda«sk 2014. Studenckie Koªo Automatyków SKALP

Dzi kuj za uwag! Spotkania z Pythonem. Cz ± 1 - podstawy - rozwi zania zada« Michaª Alichniewicz. Gda«sk 2014. Studenckie Koªo Automatyków SKALP Spotkania z Pythonem Cz ± 1 - podstawy - rozwi zania zada«michaª Alichniewicz Studenckie Koªo Automatyków SKALP Gda«sk 2014 Dzi kuj za uwag! Na licencji Creative Commons Attribution-NonCommercial-ShareAlike

Bardziej szczegółowo

(Apache) CouchDB. Krzysztof Kulewski 2008

(Apache) CouchDB. Krzysztof Kulewski 2008 (Apache) CouchDB Krzysztof Kulewski 2008 Czym CouchDB nie jest? Czym CouchDB nie jest? Relacyjną bazą danych Czym CouchDB nie jest? Relacyjną bazą danych Zamiennikiem dla relacyjnej bazy danych Czym CouchDB

Bardziej szczegółowo

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe. SWING c.d. ZAGADNIENIA: przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe. MATERIAŁY: http://docs.oracle.com/javase/tutorial/uiswing/dnd/ http://th-www.if.uj.edu.pl/zfs/ciesla/

Bardziej szczegółowo

www.irs.gov/form990. If "Yes," complete Schedule A Schedule B, Schedule of Contributors If "Yes," complete Schedule C, Part I If "Yes," complete Schedule C, Part II If "Yes," complete Schedule C, Part

Bardziej szczegółowo

Języki i metody programowania Java Lab1 https://docs.oracle.com/javase/tutorial/ Zofia Kruczkiewicz

Języki i metody programowania Java Lab1 https://docs.oracle.com/javase/tutorial/ Zofia Kruczkiewicz Języki i metody programowania Java Lab1 https://docs.oracle.com/javase/tutorial/ Zofia Kruczkiewicz Zadanie 1. Wykonanie projektu Java SE w środowisku Netbeans- File/New Project W formularzu New Project

Bardziej szczegółowo

Przykład -

Przykład - Polimorfizm Przykład - http://rpodhajny.wordpress.com klasa bazowa A, oraz klasy pochodne B1, B2,, Bn (dziedziczące po klasie bazowej). niektóre klasy pochodne chcą mieć możliwość skorzystania z metody

Bardziej szczegółowo

Generatory. Michał R. Przybyłek

Generatory. Michał R. Przybyłek Generatory Michał R. Przybyłek 1 Wstęp Generator to potencjalnie nieskończony, leniwie obliczany, ciąg wartości. W zależności od tego, która ze stron decyduje o wygenerowaniu nowej wartości wyróżniamy

Bardziej szczegółowo

Programowanie Komputerów

Programowanie Komputerów Programowanie Komputerów Łukasz Kuszner pokój 209, WETI http://www.kaims.pl/ kuszner/ kuszner@eti.pg.gda.pl Wykład 30 godzin, Laboratoria 30 godzin 2012/ Strona 1 z 28 1. Tablice w C# Indeksowane od zera

Bardziej szczegółowo

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy PODSTAWOWE ELEMENTY JĘZYKA JAVA TYPY DANYCH, OPERATORY I INSTRUKCJE 1. Definicja klasy, dziedziczenie, implementowanie metod interfejsów class nazwa_klasy //ciało klasy Klasa: przed słowem class moŝe wystąpić

Bardziej szczegółowo

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe Programowanie i projektowanie obiektowe Wstęp Paweł Daniluk Wydział Fizyki Jesień 2011 P. Daniluk (Wydział Fizyki) PO w. I Jesień 2011 1 / 26 Plan wykładu 1 Wstęp komputery, algorytmy i programy 2 Podstawowe

Bardziej szczegółowo

model isinga 2d ab 10 grudnia 2016

model isinga 2d ab 10 grudnia 2016 model isinga 2d ab 10 grudnia 2016 tematyka Model spinów Isinga Hamiltonian i suma statystyczna modelu Metoda Monte-Carlo. Algorytm Metropolisa. Obserwable Modelowanie: Model Isinga 1 hamiltonian I Hamiltonian,

Bardziej szczegółowo

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton Dzisiejszy wykład Wzorce projektowe Visitor Client-Server Factory Singleton 1 Wzorzec projektowy Wzorzec nazwana generalizacja opisująca elementy i relacje rozwiązania powszechnie występującego problemu

Bardziej szczegółowo

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1. Wielowątkowość Programowanie w środowisku rozproszonym. Wykład 1. Informacje organizacyjne Wymiar godzin: W-30, LAB-15 Zaliczenie wykonanie kilku programów i ich zaliczenie (w trakcie zajęć laboratoryjnych)

Bardziej szczegółowo

Machine Learning for Data Science (CS4786) Lecture 11. Spectral Embedding + Clustering

Machine Learning for Data Science (CS4786) Lecture 11. Spectral Embedding + Clustering Machine Learning for Data Science (CS4786) Lecture 11 Spectral Embedding + Clustering MOTIVATING EXAMPLE What can you say from this network? MOTIVATING EXAMPLE How about now? THOUGHT EXPERIMENT For each

Bardziej szczegółowo

Stanowe komponenty sesyjne

Stanowe komponenty sesyjne Stanowe komponenty sesyjne 1. Porównanie komponentów stanowych i bezstanowych. 2. Cykl życia stanowego komponentu sesyjnego, 3. Komponenty sesyjne a kontekst utrwalania, 4. Zagnieżdżanie komponentów sesyjnych,

Bardziej szczegółowo