thắc mắc nên lựa chọn multiprocessing hay threading

  • Người tạo chủ đề Người tạo chủ đề Hoangptkd
  • Ngày bắt đầu Ngày bắt đầu

Hoangptkd

Senior Member
Em đang làm cái tool đồng bộ hóa thao tác chrome , nhưng tuy nhiên khi dùng threading em cảm thấy không tối ưu , chạy được khá ít chrome ( so với 1 ứng dụng khác em đã sử dụng ). Em có tìm hiểu thì thấy có multiprocess nhưng lại khá khó dùng và không biết có phù hợp hơn threading ở khoản chạy song song profile không
 
Em đang làm cái tool đồng bộ hóa thao tác chrome , nhưng tuy nhiên khi dùng threading em cảm thấy không tối ưu , chạy được khá ít chrome ( so với 1 ứng dụng khác em đã sử dụng ). Em có tìm hiểu thì thấy có multiprocess nhưng lại khá khó dùng và không biết có phù hợp hơn threading ở khoản chạy song song profile không
Học thêm về process va threading nha, như bài trên chrome rất nặng và separate task chỉ nên chạy process chứ k dùng thread. Với đó h chạy multiprocess ms dễ, threading ms khó chứ sao ngược lại hè
 
Học thêm về process va threading nha, như bài trên chrome rất nặng và separate task chỉ nên chạy process chứ k dùng thread. Với đó h chạy multiprocess ms dễ, threading ms khó chứ sao ngược lại hè
Tại em thử sử dụng multiprocess thì code nó hơi bị loạn , em chỉ cho nó chạy 1 function nhưng nó lại chạy cả cái code , thành ra nó tạo ra hàng bao nhiêu cái gui , em có đưa gui vô 1 function nhưng mà chạy xong code vẫn gặp nhiều vấn đề. Và vấn đề lớn nhất là chương trình con không lấy được dữ liệu biến từ chương trình gốc, cái này e dg tìm cách khắc phục với hàng đợi

via theNEXTvoz for iPhone
 
Tại em thử sử dụng multiprocess thì code nó hơi bị loạn , em chỉ cho nó chạy 1 function nhưng nó lại chạy cả cái code , thành ra nó tạo ra hàng bao nhiêu cái gui , em có đưa gui vô 1 function nhưng mà chạy xong code vẫn gặp nhiều vấn đề. Và vấn đề lớn nhất là chương trình con không lấy được dữ liệu biến từ chương trình gốc, cái này e dg tìm cách khắc phục với hàng đợi

via theNEXTvoz for iPhone
Có 2 vấn đề về cách tiếp cận của bạn:
  • Task bạn muốn là chạy chrome sẽ cần compute resource để tính toán gì đó thì chạy nhiều thread sẽ bị bottleneck vì thread chỉ là tiến trình chờ, vd những task IO bound hoặc request thì xài thread được. Còn tính toán thì bạn xài nhiều thread nó vẫn chờ thằng trước tính rồi thằng sau mới có resource để tính (chỉ có 1 cpu tính toán) vì vậy xài thread ko hiệu quả mà xài process ( 1 cpu - 1 process)
  • Process là có memory riêng, bạn không thể share biến từ chương trình gốc vào function con được trừ khi clone mà phụ thuộc vào ngôn ngữ support

Cách tối ưu là bạn viết code đóng gói lại thành module chạy từ a->z. Rồi chạy multyprocess cho module đó thì sẽ scale tốt. Còn không thì phải code để dumps cái object từ ctr gốc xuống function con mà không phải object nào cũng dump được và transfer object qua từng process cũng có thể lâu nếu object to nên cách đầu tiên vẫn hiệu quả nhất và dễ scale
 
Có 2 vấn đề về cách tiếp cận của bạn:
  • Task bạn muốn là chạy chrome sẽ cần compute resource để tính toán gì đó thì chạy nhiều thread sẽ bị bottleneck vì thread chỉ là tiến trình chờ, vd những task IO bound hoặc request thì xài thread được. Còn tính toán thì bạn xài nhiều thread nó vẫn chờ thằng trước tính rồi thằng sau mới có resource để tính (chỉ có 1 cpu tính toán) vì vậy xài thread ko hiệu quả mà xài process ( 1 cpu - 1 process)
  • Process là có memory riêng, bạn không thể share biến từ chương trình gốc vào function con được trừ khi clone mà phụ thuộc vào ngôn ngữ support

Cách tối ưu là bạn viết code đóng gói lại thành module chạy từ a->z. Rồi chạy multyprocess cho module đó thì sẽ scale tốt. Còn không thì phải code để dumps cái object từ ctr gốc xuống function con mà không phải object nào cũng dump được và transfer object qua từng process cũng có thể lâu nếu object to nên cách đầu tiên vẫn hiệu quả nhất và dễ scale
Vậy các tiến trình con share dữ liệu cho nhau được ko bác
, tại lúc đầu em đọc thấy tiến trình con k share dữ liệu cho nhau , nên nghĩ nó có thể lấy dữ liệu từ gốc , mà gốc cũng k lấy được nên thấy hơi khó quản lý so với thread
via theNEXTvoz for iPhone
 
Có 2 vấn đề về cách tiếp cận của bạn:
  • Task bạn muốn là chạy chrome sẽ cần compute resource để tính toán gì đó thì chạy nhiều thread sẽ bị bottleneck vì thread chỉ là tiến trình chờ, vd những task IO bound hoặc request thì xài thread được. Còn tính toán thì bạn xài nhiều thread nó vẫn chờ thằng trước tính rồi thằng sau mới có resource để tính (chỉ có 1 cpu tính toán) vì vậy xài thread ko hiệu quả mà xài process ( 1 cpu - 1 process)
  • Process là có memory riêng, bạn không thể share biến từ chương trình gốc vào function con được trừ khi clone mà phụ thuộc vào ngôn ngữ support

Cách tối ưu là bạn viết code đóng gói lại thành module chạy từ a->z. Rồi chạy multyprocess cho module đó thì sẽ scale tốt. Còn không thì phải code để dumps cái object từ ctr gốc xuống function con mà không phải object nào cũng dump được và transfer object qua từng process cũng có thể lâu nếu object to nên cách đầu tiên vẫn hiệu quả nhất và dễ scale
mình thấy có vẻ không hợp lý lắm. cả multithread hay multiprocess đều được sinh ra để có thể tận dụng hết số core mà CPU đang có sẵn. Vậy nên bạn bảo dùng thread thì rằng sau chờ thằng trước thực hiện xong (CPU bound) mới được tính thì theo mình là không chính xác, mà với CPU có nhiều cores thì mỗi 1 thread sẽ có thể được thực hiện trên một core.

Việc chọn sử dụng multithread hay multiprocess thì tuỳ thuộc vào bài toán. Nếu muốn các tiến trình chạy độc lập => cân nhắc chọn multiprocess (cân nhắc vì chạy multiprocess sẽ tốn memory resource hơn multithread nhiều). Nếu các tiến trình cần giao tiếp lẫn nhau (chú ý thread còn được gọi lightweight process, nên mình dùng tiến trình ở đây không hẳn là chỉ process), xử dụng chung 1 phần bộ nhớ nào đó, ví dụ: lúc bạn chơi game thì thanh progress bar vẫn cập nhật, ở đây có 2 thread đang chạy một thread tính toán xử lý thao tác của bạn, một thread để tính toán cập nhật thanh progress bar của bạn. Tất nhiên khi dùng multithread, nếu một thread có vấn đề, có khả năng ảnh hưởng đến các thread khác trong tiến trình, vì các thread dùng chung heap, data segment memory của process.

Nói tóm lại cả 2 đều giúp bạn có thể giúp lập trình viên tận dụng được CPU có nhiều core, nhưng sẽ tuỳ vào bài toán để đưa ra cách xử lý phù hợp.
 
mình thấy có vẻ không hợp lý lắm. cả multithread hay multiprocess đều được sinh ra để có thể tận dụng hết số core mà CPU đang có sẵn. Vậy nên bạn bảo dùng thread thì rằng sau chờ thằng trước thực hiện xong (CPU bound) mới được tính thì theo mình là không chính xác, mà với CPU có nhiều cores thì mỗi 1 thread sẽ có thể được thực hiện trên một core.

Việc chọn sử dụng multithread hay multiprocess thì tuỳ thuộc vào bài toán. Nếu muốn các tiến trình chạy độc lập => cân nhắc chọn multiprocess (cân nhắc vì chạy multiprocess sẽ tốn memory resource hơn multithread nhiều). Nếu các tiến trình cần giao tiếp lẫn nhau (chú ý thread còn được gọi lightweight process, nên mình dùng tiến trình ở đây không hẳn là chỉ process), xử dụng chung 1 phần bộ nhớ nào đó, ví dụ: lúc bạn chơi game thì thanh progress bar vẫn cập nhật, ở đây có 2 thread đang chạy một thread tính toán xử lý thao tác của bạn, một thread để tính toán cập nhật thanh progress bar của bạn. Tất nhiên khi dùng multithread, nếu một thread có vấn đề, có khả năng ảnh hưởng đến các thread khác trong tiến trình, vì các thread dùng chung heap, data segment memory của process.

Nói tóm lại cả 2 đều giúp bạn có thể giúp lập trình viên tận dụng được CPU có nhiều core, nhưng sẽ tuỳ vào bài toán để đưa ra cách xử lý phù hợp.
Đúng là cả 2 đều sử dụng để tận dùng hết CPU resource nhưng Process mới tận dụng hết số core, Thread để tối ưu số task thực thi được trên 1 core. Mình thách bạn xài mỗi multithread để xài hết số CPU core đấy, còn vấn đề optimize như mình ban đầu nếu bạn không biết chrome code chạy ra sao => cứ dùng process để scale cho dễ vì thường 1 chrome sẽ chạy hết 1 core rồi thì bạn xài Thread để optimize gì khúc này. Đính kèm cái hình phân biệt rõ giữa cả 2 nha, còn vì sao 1 Process có thể làm nhiều việc 1 lúc thì thiên về instruction SIMD hoặc SISD của low level code.
ref: Computer Architecture | Flynn's taxonomy - GeeksforGeeks (https://www.geeksforgeeks.org/computer-architecture-flynns-taxonomy/)

1697296039958.png
 
Sửa lần cuối:
Đúng là cả 2 đều sử dụng để tận dùng hết CPU resource nhưng Process mới tận dụng hết số core, Thread để tối ưu số task thực thi được trên 1 core. Mình thách bạn xài mỗi multithread để xài hết số CPU core đấy, còn vấn đề optimize như mình ban đầu nếu bạn không biết chrome code chạy ra sao => cứ dùng process để scale cho dễ vì thường 1 chrome sẽ chạy hết 1 core rồi thì bạn xài Thread để optimize gì khúc này. Đính kèm cái hình phân biệt rõ giữa cả 2 nha, còn vì sao 1 Process có thể làm nhiều việc 1 lúc thì thiên về instruction SIMD hoặc SISD của low level code.
ref: Computer Architecture | Flynn's taxonomy - GeeksforGeeks (https://www.geeksforgeeks.org/computer-architecture-flynns-taxonomy/)

Xem tệp đính kèm 2127461
Trong hình của bạn là Thread của CPU, cần phân biệt nó với Thread của ngôn ngữ lập trình.
Bạn implement bằng nodejs hoặc python thì cần sử dụng multi process để tận dụng hết số cores, cái này do đặc tính ngôn ngữ, ví dụ như của Python là GIL.
Nhưng nếu dùng ngôn ngữ như Java, thì dùng Multi Thread là đủ.
Khi tạo thread, nó sẽ gắn với một OS thread, OS sẽ lập lịch để chạy thread.


via theNEXTvoz for iPhone
 
Trong hình của bạn là Thread của CPU, cần phân biệt nó với Thread của ngôn ngữ lập trình.
Bạn implement bằng nodejs hoặc python thì cần sử dụng multi process để tận dụng hết số cores, cái này do đặc tính ngôn ngữ, ví dụ như của Python là GIL.
Nhưng nếu dùng ngôn ngữ như Java, thì dùng Multi Thread là đủ.
Khi tạo thread, nó sẽ gắn với một OS thread, OS sẽ lập lịch để chạy thread.


via theNEXTvoz for iPhone
Ukm mình hơi nhầm khúc này nhiều ngôn ngữ support Threads xuống thẳng tầng OS, nhưng vậy thì cũng ko sai ý ban đầu của mình thread nó depend rất nhiều thứ nên scale dễ cho trường hợp bạn kìa là dùng Process.
 
Đúng là cả 2 đều sử dụng để tận dùng hết CPU resource nhưng Process mới tận dụng hết số core, Thread để tối ưu số task thực thi được trên 1 core. Mình thách bạn xài mỗi multithread để xài hết số CPU core đấy, còn vấn đề optimize như mình ban đầu nếu bạn không biết chrome code chạy ra sao => cứ dùng process để scale cho dễ vì thường 1 chrome sẽ chạy hết 1 core rồi thì bạn xài Thread để optimize gì khúc này. Đính kèm cái hình phân biệt rõ giữa cả 2 nha, còn vì sao 1 Process có thể làm nhiều việc 1 lúc thì thiên về instruction SIMD hoặc SISD của low level code.
ref: Computer Architecture | Flynn's taxonomy - GeeksforGeeks (https://www.geeksforgeeks.org/computer-architecture-flynns-taxonomy/)

Xem tệp đính kèm 2127461
- "Đúng là cả 2 đều sử dụng để tận dùng hết CPU resource nhưng Process mới tận dụng hết số core" => tận dụng hết CPU resource chính là tận dụng hết số core CPU chứ còn gì bạn.

- mình đã đọc qua reference trong comment của bạn, bài viết chỉ nói về các kiểu kiến trúc máy tính Michael Flynn, chứ không có nói tới multiprocess có thể tận dụng được tối đa số core CPU còn multithread thì không. Các máy tính hiện đại bây giờ hầu hết đều theo kiến trúc MIMD, và việc có thể nhiều thread được xử lý parallel ở nhiều core cpu tại một thời điểm là điều quá bình thường.

"1 Process có thể làm nhiều việc 1 lúc thì thiên về instruction SIMD hoặc SISD của low level code." => 1 thread có thể làm nhiều việc 1 lúc, ý của bạn là gì, bạn có thể diễn đạt rõ hơn được không.
- Mình không nói về vấn đề sử dụng của bạn kia trong trường hợp chrome, mình chỉ muốn phản biện lại ý kiên của bạn cho rằng, nếu sử dụng multithread thì không thể tận dụng hết số core của CPU.

- Theo mình bản chất của phần cứng máy tính không có khái niệm process hay thread, đó đều là khái niệm của phần mềm. Với phần cứng chỉ cần thanh ghi Program counter đang trong đến vùng nhớ của instruction nào thì nó sẽ tự động fetch instruction đó về thanh Instruction Register để tự động tính toán. Vì vậy ở đây bạn có thể giải thích vì sao không thể có nhiều threads cùng chạy trên nhiều cores khác nhau?

Còn về vấn đề nhiều threads của một tiến trình có thể cùng được xử lý trên nhiều core khác nhau. Mình trích ra một đoạn trọng phần mở đầu chương multithread của cuốn sách nổi tiếng operating system concept có nói như sau:
"A thread is a basic unit of CPU utilization; it comprises a thread ID, a programcounter, a register set, and a stack. It shares with other threads belongingto the same process its code section, data section, and other operating-systemresources, such as open files and signals. A traditional (or heavyweight) process has a single thread of control. If a process has multiple threads of control, it can perform more than one task at a time."

Bạn có thể đọc thêm về tài liệu này.
 
Sửa lần cuối:
Đúng là cả 2 đều sử dụng để tận dùng hết CPU resource nhưng Process mới tận dụng hết số core, Thread để tối ưu số task thực thi được trên 1 core. Mình thách bạn xài mỗi multithread để xài hết số CPU core đấy, còn vấn đề optimize như mình ban đầu nếu bạn không biết chrome code chạy ra sao => cứ dùng process để scale cho dễ vì thường 1 chrome sẽ chạy hết 1 core rồi thì bạn xài Thread để optimize gì khúc này. Đính kèm cái hình phân biệt rõ giữa cả 2 nha, còn vì sao 1 Process có thể làm nhiều việc 1 lúc thì thiên về instruction SIMD hoặc SISD của low level code.
ref: Computer Architecture | Flynn's taxonomy - GeeksforGeeks (https://www.geeksforgeeks.org/computer-architecture-flynns-taxonomy/)

Xem tệp đính kèm 2127461
như e đọc ở :

thì thấy việc OS schedule threads trên nhiều cores của 1 process là bình thường mà nhỉ
 
Đúng là cả 2 đều sử dụng để tận dùng hết CPU resource nhưng Process mới tận dụng hết số core, Thread để tối ưu số task thực thi được trên 1 core. Mình thách bạn xài mỗi multithread để xài hết số CPU core đấy, còn vấn đề optimize như mình ban đầu nếu bạn không biết chrome code chạy ra sao => cứ dùng process để scale cho dễ vì thường 1 chrome sẽ chạy hết 1 core rồi thì bạn xài Thread để optimize gì khúc này. Đính kèm cái hình phân biệt rõ giữa cả 2 nha, còn vì sao 1 Process có thể làm nhiều việc 1 lúc thì thiên về instruction SIMD hoặc SISD của low level code.
ref: Computer Architecture | Flynn's taxonomy - GeeksforGeeks (https://www.geeksforgeeks.org/computer-architecture-flynns-taxonomy/)

Xem tệp đính kèm 2127461
nhưng mà học môn hệ điều hành trên trường thì chỉ thấy đề cập đến OS schedule process , chứ ko thấy nói về threads :D:D
 
Em đang làm cái tool đồng bộ hóa thao tác chrome , nhưng tuy nhiên khi dùng threading em cảm thấy không tối ưu , chạy được khá ít chrome ( so với 1 ứng dụng khác em đã sử dụng ). Em có tìm hiểu thì thấy có multiprocess nhưng lại khá khó dùng và không biết có phù hợp hơn threading ở khoản chạy song song profile không
B làm kiểu j đó
 
Số lượng chrome điều khiển làm sao liên quan tới cái tool điều khiển đc, nó liên quan tới máy tính, tới config chrome.
coi lại cái config chrome xem coi tối ưu chưa, chứ lập trình cái tool chạy đa luồng liên quan gì tới vụ bật nhiều hay ít chrome.
 
Số lượng chrome điều khiển làm sao liên quan tới cái tool điều khiển đc, nó liên quan tới máy tính, tới config chrome.
coi lại cái config chrome xem coi tối ưu chưa, chứ lập trình cái tool chạy đa luồng liên quan gì tới vụ bật nhiều hay ít chrome.
Có chứ bác , em chạy 1 lúc nhiều chrome và các chrome hoạt động đa luồng cùng 1 lúc thì nó sẽ cần đến đa luồng , hoặc đa tiến trình, thì có 2 phương pháp là sử dụng multiprocess và thread như em đề cập ở trên , em đang tham khảo mọi người về cách nào tốt hơn ý ạ

via theNEXTvoz for iPhone
 
mình thấy có vẻ không hợp lý lắm. cả multithread hay multiprocess đều được sinh ra để có thể tận dụng hết số core mà CPU đang có sẵn. Vậy nên bạn bảo dùng thread thì rằng sau chờ thằng trước thực hiện xong (CPU bound) mới được tính thì theo mình là không chính xác, mà với CPU có nhiều cores thì mỗi 1 thread sẽ có thể được thực hiện trên một core.

Việc chọn sử dụng multithread hay multiprocess thì tuỳ thuộc vào bài toán. Nếu muốn các tiến trình chạy độc lập => cân nhắc chọn multiprocess (cân nhắc vì chạy multiprocess sẽ tốn memory resource hơn multithread nhiều). Nếu các tiến trình cần giao tiếp lẫn nhau (chú ý thread còn được gọi lightweight process, nên mình dùng tiến trình ở đây không hẳn là chỉ process), xử dụng chung 1 phần bộ nhớ nào đó, ví dụ: lúc bạn chơi game thì thanh progress bar vẫn cập nhật, ở đây có 2 thread đang chạy một thread tính toán xử lý thao tác của bạn, một thread để tính toán cập nhật thanh progress bar của bạn. Tất nhiên khi dùng multithread, nếu một thread có vấn đề, có khả năng ảnh hưởng đến các thread khác trong tiến trình, vì các thread dùng chung heap, data segment memory của process.

Nói tóm lại cả 2 đều giúp bạn có thể giúp lập trình viên tận dụng được CPU có nhiều core, nhưng sẽ tuỳ vào bài toán để đưa ra cách xử lý phù hợp.
Nếu theo bác thì e thấy trong bài toán của em sử dụng multiprocess là hợp lý , nhưng nếu khác biệt của nó chỉ là multiprocess không share dữ liệu thì em sử dụng thread nhưng cho nó chạy độc lập không share dữ liệu thì nó cx k khác multiprocess phải k ạ, e hơi k hiểu phần này

via theNEXTvoz for iPhone
 
Em đang làm cái tool đồng bộ hóa thao tác chrome , nhưng tuy nhiên khi dùng threading em cảm thấy không tối ưu , chạy được khá ít chrome ( so với 1 ứng dụng khác em đã sử dụng ). Em có tìm hiểu thì thấy có multiprocess nhưng lại khá khó dùng và không biết có phù hợp hơn threading ở khoản chạy song song profile không
Bạn đang nói tới ngôn ngữ nào, Java hay Python ? Chạy trên OS nào ?
 

Thống kê chủ đề

Ngày tạo
Hoangptkd,
Người trả lời cuối
ikrus,
Trả lời
39
Lượt xem
4.599
Quay lại
Lên đầu trang