Hôm nay chúng ta sẽ đi vào bài 1.3. Ở bài này, chúng ta sẽ cùng nhau đi tìm hiểu về quá trình forking trong python nhé. Nào, bắt đầu vào công việc thôi.
Forking ( chia nhánh) là một quá trình quan trọng nhất của Unix và Linux. Khi một tiến trình rẽ nhánh, nó sẽ tạo ra bản sao của chính nó. Tổng quát hơn, quá trình chia nhánh trong môi trường đa luồng là một luồng thực thi sẽ được nhân đôi, tạo ra một luồng con từ luồng cha. Chúng có thể giống nhau.
Hoạt động Forking tạo ra một không gian nhớ riêng biệt cho tiến trình con. Tiến trình con sẽ sao lưu tất cả bộ nhớ của tiến trình cha. Và tiến trình cha với tiến trình con sẽ hoạt động độc lập với nhau.
Chức năng của hệ thống là fork() tạo ra một bản sao của tiến trình đã gọi nó. Bản sao này chạy như một tiến trình con của tiến trình đã gọi. Tiến trình con lấy các dữ liệu và mã của tiến trình cha. Tiến trình con nhận được số tiến trình (PID) của riêng nó từ hệ điều hành. Và nó chạy độc lập với tiến trình cha mẹ. Với giá trị trả về của fork(), chúng ta có thể quyết định được tiến trình chúng ta đang ở: 0 có nghĩa là chúng ta đang trong tiến trình con và khi có một giá trị tích cực được trả lại nghĩa là chúng ta đang trong tiến trình cha. Môt giá trị tiêu cực có nghĩa là có lỗi khi cố gắng chia nhánh.
Để sử dụng được tiến trình fork, chúng ta cần nạp vào module os trong python. Ví dụ dưới đây chỉ ra tiến trình cha trong quá trình chia nhánh liên tục, đến khi người dùng ấn "q" từ dấu nhắc. Cả tiến trình con và tiến trình cha sẽ tiếp tục sau điều kiện if. Giá trị của newpid lớn hơn 0 khi chúng ta đang ở tiến trình cha và 0 là ở tiến trình con. Trong tiến trình con chúng ta cần sử dụng os.exit(0) để thoát khỏi tiến trình con và về chương trình cha. Sau đây là ví dụ:
Kết quả, khi chúng ta nhập vào bất kì kí tự khác q nào, chương trình tự động tạo ra một tiến trình con từ tiến trình cha với 1 số pid khác nhau.
Giữa tiến trình cha và tiến trình con là độc lập, nhưng các bạn có thể cho chúng tương tác với nhau bằng cách sử dụng IPC module của python. Mình sẽ không đi cụ thể vào module này của python nên bạn nào muốn tìm hiểu có thể lên mạng tìm kiếm.
Như ví dụ trước chúng ta có 1 chức năng được xác định trong cùng 1 tập tin kịch bản. Forks thường được sử dụng để bắt đầu 1 chương trình độc lập. Để làm điểu này chúng ta cần chức năng exec*(). Chức năng này thực hiện một chương trình mới bằng cách thay thế các tiến trình hiện hành của chương trình này. Nó không trở lại chương trình đã gọi là. Và thâm chí nó có cùng pid như tiến trình đã gọi nó.
Có khá nhiều hàm exec*() của module os:
Đến đây mình xin kết thúc bài về quá trình forking hay còn gọi là chia nhánh trong Python. Hy vọng các bạn nắm vững được bài học. Hẹn gặp lại các bạn vào bài tiếp theo.
Forking ( chia nhánh) là một quá trình quan trọng nhất của Unix và Linux. Khi một tiến trình rẽ nhánh, nó sẽ tạo ra bản sao của chính nó. Tổng quát hơn, quá trình chia nhánh trong môi trường đa luồng là một luồng thực thi sẽ được nhân đôi, tạo ra một luồng con từ luồng cha. Chúng có thể giống nhau.
Hoạt động Forking tạo ra một không gian nhớ riêng biệt cho tiến trình con. Tiến trình con sẽ sao lưu tất cả bộ nhớ của tiến trình cha. Và tiến trình cha với tiến trình con sẽ hoạt động độc lập với nhau.
- fork()
Để sử dụng được tiến trình fork, chúng ta cần nạp vào module os trong python. Ví dụ dưới đây chỉ ra tiến trình cha trong quá trình chia nhánh liên tục, đến khi người dùng ấn "q" từ dấu nhắc. Cả tiến trình con và tiến trình cha sẽ tiếp tục sau điều kiện if. Giá trị của newpid lớn hơn 0 khi chúng ta đang ở tiến trình cha và 0 là ở tiến trình con. Trong tiến trình con chúng ta cần sử dụng os.exit(0) để thoát khỏi tiến trình con và về chương trình cha. Sau đây là ví dụ:
Code:
import os def child(): print 'A new child ', os.getpid( ) os._exit(0) def parent(): while True: newpid = os.fork() if newpid == 0: child() else: pids = (os.getpid(), newpid) print "parent: %d, child: %d" % pids if raw_input( ) == 'q': break parent()
Code:
parent: 6799, child: 6800 A new child 6800 d parent: 6799, child: 6801 A new child 6801 r parent: 6799, child: 6802 A new child 6802 q
- Bắt đầu một tiến trình độc lập thông qua fork()
Có khá nhiều hàm exec*() của module os:
- os.execle(path, arg0, arg1, ..., env)
- os.execlp(file, arg0, arg1, ...)
- os.execlpe(file, arg0, arg1, ..., env)
- os.execv(path, args)
- os.execve(path, args, env)
- os.execvp(file, args)
- os.execvpe(file, args, env)
Code:
kma@kma-Satellite-C840:~$ python Python 2.7.6 (default, Mar 22 2014, 22:59:56) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> >>> os.execvp("ping",["ping","127.0.0.1"]) PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.033 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.039 ms 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.040 ms 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.038 ms 64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.055 ms ^C --- 127.0.0.1 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 3996ms rtt min/avg/max/mdev = 0.033/0.041/0.055/0.007 ms
No comments:
Post a Comment