Görüşme tamamlandı! 2020 sürüngen mülakat soruları koleksiyonu

Yazar | Anonim Netizen

Üretildi | CSDN Blogu

Tarayıcılarla tanışın

1. Tarayıcı: İnternetteki bilgileri otomatik olarak toplayan bir komut dosyası.

2. Tarayıcıların çözebileceği sorunlar:

(1) Soğuk çalıştırma sorununu çözün

(2) Arama motorlarının temeli: tarayıcılar arama motorları için vazgeçilmezdir

(3) Makine öğrenimi bilgi grafiği oluşturmaya yardımcı olacak bir bilgi grafiği oluşturun

(4) Fiyat karşılaştırma yazılımı ve çeşitli malların trend analizi yapılabilir.

3. Tarayıcı sınıflandırması

(1) Genel tarayıcı: Arama motorunun ana bileşeni, internetteki tüm sayfayı taramak ve yerel olarak kaydetmektir.

(2) Odaklanmış tarayıcılar: Odaklı tarayıcılar, web sayfası taramasını uygularken içeriği işler ve filtreler ve yalnızca ihtiyaçlarla ilgili web sayfası bilgilerinin taranmasını sağlamaya çalışır.

Genel bir tarayıcı ile odaklanmış bir tarayıcı arasındaki fark: Odaklanmış bir tarayıcı web taramasını uyguladığında, içeriği işler ve filtreler ve yalnızca ihtiyaçlarla ilgili web bilgilerinin taranmasını sağlamaya çalışır.

4. Tarayıcının izlediği protokol: robot protokolü

Tanım: Web tarayıcısı hariç tutma ölçütleri.

Rol: Arama motorlarına nerede taranacağını ve nerede taranmayacağını söyleyin.

5. Genel tarayıcı iş akışı

(1) Web sayfalarını tara: web sayfasının içeriğini taramak için arama motoru aracılığıyla genel tarayıcının URL sırasına taranacak URL'yi ekleyin

(2) Veri depolama: Taranan web sayfasını yerel olarak kaydedin. Bu işlem belirli bir tekilleştirme işlemine sahip olacaktır. Bir web sayfasının içeriğinin çoğu tekrarlanırsa, arama motoru onu kaydetmeyebilir.

(3) Ön işleme: metni çıkarın, Çince kelime segmentasyonu, gürültüyü ortadan kaldırın (telif hakkı bildirim metni, gezinme çubuğu, reklam, vb.).

(4) Kullanıcılara hizmet sağlamak için web sitesi sıralamasını ayarlayın.

6. Bazı tırmanış önleme ve karşı önlemler

(1) Kullanıcı aracısı aracılığıyla bir tarayıcı olup olmadığına karar verin.

Çözüm: Kullanıcı aracısını istek başlığında gizleyerek çözülebilir. Kullanıcı aracısı algılanırsa, çok sayıda kullanıcı aracısı bulabilir, bunları listeye ekleyebilir ve ardından bunları değiştirebilirsiniz.

(2) IP'yi engelleyin.

Çözüm: IP, bir proxy aracılığıyla gizlenebilir.

(3) Sıklığı ziyaret ederek bir tarayıcı olup olmadığına karar verin.

Çözüm: İstek aralığını ve tarama aralığını ayarlayabilirsiniz.

(4) Belirli bir süre içinde toplam istek sayısı üst sınırı aştığında, bir doğrulama kodu açılır.

Çözüm: Basit doğrulama kodu görüntüleri için, işlemek için tesseract'ı kullanabilir ve karmaşık olanlar için kodlama platformuna gidebilirsiniz.

(5) Sayfa verilerini JS aracılığıyla alın.

Çözüm: Veri almak için JS'yi yüklemek için selenium + phantomjs kullanabilirsiniz.

Arama motorlarıyla tanışın

1. Arama motorlarının ana bileşenleri

Evrensel tarayıcı: İnternette sayfanın tamamını taradıktan sonra yerel olarak kaydedin.

Bir web sayfasını taramak için, genel bir tarayıcının web sitesinin URL'sine ihtiyacı vardır, ancak arama motorları tüm web sayfalarını arayabilir. O zaman evrensel tarayıcı url'si tüm web sayfalarını kapsayacaktır, bu "hepsi" nasıl olur?

  • Yeni web sitesi, URL'yi aktif olarak arama motoruna gönderir;

  • Diğer web sitelerinde yeni web sitesi dış bağlantıları oluşturun;

  • Arama motoru, DNS çözümleme hizmeti sağlayıcıları (DNSPod, vb.) İle işbirliği yapar ve yeni web sitesi etki alanı adı hızla taranır.

2. Arama motoru iş akışı (genel tarayıcı iş akışı)

(1) Web sayfalarını tarama: Web sayfasının içeriğini taramak için, taranacak URL'yi arama motoru aracılığıyla genel tarayıcının URL sırasına ekleyin.

(2) Veri depolama: Taranan web sayfasını yerel olarak kaydedin. Bu işlem belirli bir tekilleştirme işlemine sahip olacaktır. Bir web sayfasının içeriğinin çoğu tekrarlanırsa, arama motoru onu kaydetmeyebilir.

(3) Ön işleme: metni çıkarın, Çince kelime segmentasyonu, gürültüyü ortadan kaldırın (telif hakkı bildirim metni, gezinme çubuğu, reklam, vb.).

(4) Kullanıcılara hizmet sağlamak için web sitesi sıralamasını ayarlayın.

3. Arama motorlarının sınırlamaları

(1) Arama motorları yalnızca orijinal web sayfasını tarayabilir, ancak sayfadaki içeriğin% 90'ı işe yaramaz.

(2) Arama motorları, farklı sektörlerin ve farklı kişilerin özel ihtiyaçlarını karşılayamaz.

(3) Genel arama motorları yalnızca metin bilgilerini tarayabilir, ses, resim vb. Bilgileri tarayamaz.

(4) Sorgular yalnızca anahtar kelimelere dayalı olabilir, anlamsal sorgulara değil.

HTTP'ye Giriş

Yedi katmanlı ağ protokolü:

1. HTTP protokol özellikleri

  • HTTP protokolü bir hiper metin aktarım protokolüdür;

  • HTTP protokolü bir uygulama katmanı protokolüdür;

  • Bağlantı yok: her istek bağımsızdır;

  • Durumsuz, istemcinin her bir istek için istek durumunu kaydedemeyeceği, yani iki isteğin doğrudan iletişim kuramayacağı anlamına gelir.

2. HTTP çalışma süreci

  • DNS, adresi çözer ve URL'yi karşılık gelen içeriğe çözümler

  • HTTP istek paketlerini kapsülleyin

  • Bunu bir TCP paketine kapsülleyin ve bir TCP bağlantısı kurun (TCP üç yönlü el sıkışma)

  • Müşteri istek gönderir

  • Sunucu isteği alır ve bir yanıt gönderir

  • Müşteri yanıtı alır ve sayfa oluşturmayı gerçekleştirir

  • Sunucu TCP bağlantısını kapatır (dört TCP dalgası)

3. HTTP protokolü ile HTTPS protokolü arasındaki fark

  • HTTP protokolü, düz metin veri iletimi kullanan bir ağ protokolüdür. Düz metin iletimi, kullanıcıların çok büyük bir güvenlik riskine sahip olmasına neden olur. 80 numaralı bağlantı noktası

  • HTTPS protokolü, HTTP temelinde veri şifrelemeyi artırmak olan HTTP protokolünün güvenli bir yükseltilmiş sürümü olarak anlaşılabilir. 443 numaralı bağlantı noktası

  • HTTPS protokolü, HTTP protokolünden daha güvenli olan şifreli aktarım ve kimlik doğrulamasını gerçekleştirebilen SSL + HTTP protokolü tarafından oluşturulan bir ağ protokolüdür.

4. HTTP iletişimi

HTTP iletişimi iki bölümden oluşur: istemci istek mesajı ve sunucu yanıt mesajı.

5. Genel yanıt kodlarına yanıt verme hakkında

6. Müşteri isteği (Al ve Gönder arasındaki fark)

(1) Kompozisyon: dört bölüm: istek satırı, istek başlığı, boş satır ve istek verileri

(2) Talep yöntemi Al / Gönder

(3) Al ve Gönder arasındaki fark

GET ve POST esasen TCP bağlantılarıdır, hiçbir fark yoktur. Ancak HTTP düzenlemeleri ve tarayıcı / sunucu kısıtlamaları nedeniyle uygulama sürecinde bazı farklılıklar gösterirler.

(4) Ortak istek başlığı

User-Agent: müşteri talep tanımlama.

Kabul et: Dosya türünü aktarın.

Referer: Talebin kaynağı.

cookie (cookie): Bu başlığın oturum açarken kapsüllenmesi gerekir.

İçerik Türü (POST veri türü)

7. Sunucu yanıtı

(1) Kompozisyon: durum satırı, yanıt başlığı, boş satır, yanıt gövdesi.

(2) Ortak yanıt başlıkları

İçerik Türü: metin / html; kaynak dosyası türü ve karakter kodlaması

İçerik Uzunluğu: yanıt uzunluğu

İçerik Boyutu yanıt boyutu

İçerik Kodlama, istemciye sunucu tarafından gönderilen kaynaklar için hangi kodlamanın kullanıldığını söyler.

Bağlantı: canlı tut bu alan, istemcinin Bağlantısına yanıt verir: canlı tut, istemciye sunucunun tcp bağlantısının da uzun bir bağlantı olduğunu ve istemcinin HTTP istekleri göndermek için bu TCP bağlantısını kullanmaya devam edebileceğini söyler

url

Tekdüzen Kaynak Konum Belirleyicisi:

Temel biçim: şema: // ana bilgisayar / yol / /? Sorgu dizesi Protokol: // Sunucu ip adresi: bağlantı noktası numarası / kaynak yolu /? Key1 = parametre 1key2 = parametre 2

şema: Protokol (örneğin: HTTP, HTTPS, FTP)

ana bilgisayar / IP: sunucunun IP adresi veya alan adı

bağlantı noktası: sunucunun bağlantı noktası (protokolün varsayılan bağlantı noktasıysa, varsayılan bağlantı noktası 80'dir), bilgisayara İnternet'ten girmek için kullanılır

yol: Kaynağa erişmenin yolu, bilgisayardaki ilgili kaynak yolunu bulmaktır

sorgu dizesi: parametreler, http sunucusuna gönderilen veriler

çapa: bağlantı (web sayfasının belirtilen bağlantı konumuna atla)

S: Tarayıcıya bir URL girdiğimizde, neden bir sayfa yüklenebilir? Paket yakalama işlemi sırasında bir URL istendiğinde neden birçok kaynak isteği var?

Tarayıcıya bir URL girdiğimizde, istemci içeriği almak için sunucuya bu URL'ye karşılık gelen bir istek gönderecektir. Sunucu bu isteği alır, ilgili içeriği ayrıştırır ve ardından içeriği yanıtta kapsüller ve istemciye gönderir.

Müşteri bu HTML sayfasını aldığında, bu sayfada CSS, JS, resim vb. URL'lerin olup olmadığını kontrol edecek ve varsa bu kaynakları elde etmek için ayrı isteklerde bulunacaktır.

Müşteri, HTML sözdizimi yoluyla elde edilen tüm içeriği mükemmel bir şekilde gösterecektir.

Çerez ve Oturum

Sebep: HTTP durumsuz bir protokol olduğu için her istek için önceden bazı bilgiler gerekliyse kaydedilemez, bu nedenle bu sorunu çözmek için bir durum kayıt teknolojisi olan Çerez ve Oturum üretilir.

Çerez, kullanıcının kimliğini belirlemek ve oturum takibini gerçekleştirmek için bazı web sitelerinin kullanıcının yerel terminalinde depoladığı verileri ifade eder.Oturum çerezleri ve kalıcı çerezler vardır.

(1) Oturum çerezleri, tarayıcı belleğinde saklanan çerezlere atıfta bulunur. Tarayıcı kapatıldığında, oturum çerezleri geçersiz hale gelir;

(2) Kalıcı çerezler, sabit diskte saklanan çerezlerdir.

Oturum, belirli bir kullanıcı oturumu için gerekli öznitelikleri ve yapılandırma bilgilerini depolamak için kullanılır.

Cookie, istemci tarafındaki durumu kaydeder ve Session, sunucu tarafındaki durumu kaydeder.

İletişim: Müşteri bir Tanımlama Bilgisi gönderdiğinde, sunucu tanımlama bilgisinden oturum kimliğini bulur ve ardından ilgili Oturum bilgilerini bulur ve kullanıcı sayfası dolaşımı için istemciye geri gönderir. Oturum kimliğine göre (genellikle ilk kez oturum açtığınızda veya tarayıcıyı boşalttığınızda) Oturum olmadığını tespit ederseniz, bir Oturum oluşturulacaktır.

hashlib parola şifreleme

def get_hex (değer):

md5_ = hashlib.md5

md5_.update (değer.encode ('utf-8'))

döndür md5_.hexdigest

Response.text bozuk sorunu hakkında

Yanıtın ortak özellikleri:

1. string türünün yanıt gövdesini alın: response.text

2. Bayt türü yanıt gövdesini alın: response.content

3. Yanıt gövdesi dizesi kodlaması: response.encoding

4. Durum kodu: response.status_code

5. Yanıt başlığı: response.headers

Response.text bozuk problem:

# Yöntem 1: utf-8 biçimine dönüştür

response.encoding = 'utf-8'

baskı (response.text)

# Yöntem 2: utf-8'e kod çözme:

fp: fp.write (response.content.decode ('utf-8')) olarak open ('index.html', 'w', encoding = 'utf-8') ile

vekil

Temsilcinin rolü:

1. Kendi IP erişim kısıtlamalarınızı aşın ve genellikle ziyaret edemeyeceğiniz bazı siteleri ziyaret edin.

2. Bazı birimlerin veya grupların dahili kaynaklarına erişin: Örneğin, eğitim ağının adres bölümündeki ücretsiz proxy sunucusunun kullanılması, eğitim ağına açık çeşitli FTP yüklemeleri ve yüklemelerinin yanı sıra çeşitli veri sorgulama ve paylaşım hizmetleri için kullanılabilir.

3. Erişim hızını artırın: Genellikle proxy sunucusu büyük bir sabit disk arabelleği ayarlar. Harici bilgiler geçerken, arabelleğe de kaydedilir.Diğer kullanıcılar aynı bilgilere tekrar eriştiğinde, doğrudan kullanılır Bilgi tampondan alınır ve erişim hızını iyileştirmek için kullanıcıya iletilir.

4. Gerçek IP'yi gizleyin: İnternet kullanıcıları, saldırıları önlemek için bu yöntemle IP'lerini de gizleyebilir. Tarayıcılar için, IP'mizi gizlemek ve engellenmemizi önlemek için proxy kullanıyoruz.

Temsilciler, anonimlik derecesine göre sınıflandırılır:

JSON verileri

Verilerin sınıflandırılması:

JSON'un özü: bir dizedir ve JSON, bir JS nesnesinin dize ifadesidir. Bir JS nesnesinin bilgilerini temsil etmek için metni kullanır.

JSON kullanımı:

(1) json.dumps (Python listesi veya dict), Python listesi veya dict'i JSON dizesi olarak döndürür;

(2) json.loads (json dizesi), JSON dizesini Python listesi veya dikte olarak döndürür;

(3) json.dump (list / dict, fp), Python listesini veya diktesini bir JSON dizesine dönüştürün ve bir dosyaya kaydedin;

(4) json.load (fp), JSON verilerini bir JSON dosyasından okuyun ve Python listesine veya dikteye dönüştürün.

Düzenli ifade

1. Açgözlü ve açgözlü olmayan

(1) Normal, varsayılan olarak açgözlü moddur, bu nedenle sayı kontrol sembolü varsayılan olarak maksimum değere döner ve bu da açgözlüdür. Örneğin*

(2) Açgözlü olmayan nedir? Kontrol etmek için en az sayıda, 0 kez veya bir kez eşleştirmeye çalışın.

2. Python biçimi:

pattern = re.compile ('Normal ifade') print (pattern.match (string, start, end)) # başlangıçtan varsayılan eşleşme, sadece bir kez eşleş, bir eşleşme nesnesi döndür print (pattern.search (string, start, end)) # Herhangi bir konumdan eşleşmeye başlayın, yalnızca bir kez eşleştirin ve bir eşleşme nesnesi döndür print (pattern.findall (string, start, end)) # Tam metin birden çok kez eşleşir, eşleşen sonuçları bir listeye koyun ve bize geri dönün print (pattern.finditer (string, start, end)) # Tam metin birden çok kez eşleştirilir ve eşleşen sonuç, bir eşleşme nesnesinin yineleyicisine döndürülür

3. Yaygın düzenli sorunlar

XML

Temel XML bilgisi:

1. Tanım: XML, HTML'ye benzer şekilde genişletilebilir işaretleme dili olarak adlandırılır;

2. Özellikler: XML, kendi kendini tanımlayan özelliklere sahiptir ve bir tür yarı yapılandırılmış veridir;

3. Rol: XML, verileri görüntülemek için değil, verileri iletmek için tasarlanmıştır. Bazı önemli bilgileri kaydetmek için bir yapılandırma dosyası olarak kullanılabilir;

4. XML etiketlerinin tarafımızca tanımlanması gerekir.

HTML ve XML arasındaki fark:

Dilbilgisi:

  • HTML'de büyük / küçük harfe duyarlı değildir ve XML'de kesinlikle büyük / küçük harfe duyarlı değildir

  • HTML'de bazı durumlarda kapanış etiketleri ihmal edilebilir. XML'de hiçbir etiketi ihmal etmemelisiniz.

  • XML'de, tek bir etiketin sonuna "/" eklemeniz gerekir.

  • XML belgelerinde boş kısımlar ayrıştırıcı tarafından otomatik olarak silinmez, ancak HTML boşlukları filtreler

  • XML'de, öznitelik değerleri tırnak işaretleri içine alınmalıdır. HTML'de tırnak işaretleri kullanılabilir veya kullanılamaz.

  • HTML'deki öznitelik adının öznitelik değeri olamaz ve XML öznitelik değerine sahip olmalıdır ve boş olamaz.

Farklı etiketler:

HTML, doğasında bulunan biçimlendirmeyi kullanır, XML'nin içsel biçimlendirmesi yoktur.

Farklı roller:

XML esas olarak veri iletmek için kullanılır ve HTML esas olarak verileri görüntülemek için kullanılır.

Selenyum + PhantomJS

Selenium: Web otomatik test aracı.

PantomJS: Arayüzsüz bir tarayıcıdır, bu nedenle sayfa verilerini almamıza yardımcı olmak için JS kodunu çalıştırabilir.

Özellikler: Güçlüdür, hemen hemen her web sayfasıyla başa çıkabilir, ancak düşük kod verimliliğine yol açacaktır.

Selenium, Web için otomatik bir test aracıdır. Talimatlarımıza göre, tarayıcı sayfayı otomatik olarak yükleyebilir, gerekli verileri alabilir, hatta sayfanın ekran görüntüsünü alabilir veya web sitesinde belirli eylemlerin gerçekleşip gerçekleşmediğini belirleyebilir. Selenium'un bir tarayıcısı yoktur ve tarayıcının işlevlerini desteklemez.Kullanmak için üçüncü taraf bir tarayıcıyla birleştirilmesi gerekir. Ancak bazen onu koda gömülü çalıştırmamız gerekir, böylece gerçek bir tarayıcı yerine bir PhantomJS aracı kullanabiliriz. Selenium kütüphanesinde WebDriver adında bir API var. WebDriver, bir web sitesini yükleyebilen bir tarayıcıya benzer, ancak aynı zamanda sayfa öğelerini bulabilir, sayfadaki öğelerle etkileşime girebilir (metin gönderme, tıklama vb.) Ve web tarayıcılarını çalıştırmak için diğer eylemleri gerçekleştirebilir.

PhantomJS, Webkit tabanlı "arabirimsiz" bir tarayıcıdır. Web sitesini belleğe yükler ve sayfada JavaScript çalıştırır. Grafik bir arabirim göstermediği için tam bir tarayıcıdan daha verimli çalışır. Geleneksel Chrome veya Firefox tarayıcısıyla karşılaştırıldığında, kaynak tüketimi daha az olacaktır. Selenium ve PhantomJS'yi birleştirirsek, JavaScript, Çerezler, başlıklar ve gerçek kullanıcılarımızın yapması gereken her şeyi işleyebilen çok güçlü bir web tarayıcısı çalıştırabiliriz. Ana program çıktıktan sonra selenyum, phantomJS'nin de başarılı bir şekilde çıkacağını garanti etmez. PhantomJS sürecini manuel olarak kapatmak en iyisidir. (Birden fazla phantomJS işleminin çalışmasına ve hafızayı işgal etmesine neden olabilir). WebDriverWait gecikmeyi azaltabilse de, hatalar var (çeşitli hatalar) Bu durumda, uyku kullanılabilir. phantomJS, verileri taramakta yavaştır, çoklu iş parçacığı seçebilirsiniz. Bazılarının çalışırken bazılarının çalışabileceğini fark ederseniz, phantomJS'yi Chrome olarak değiştirmeyi deneyebilirsiniz.

Simüle edilmiş giriş yapmanın yolları nelerdir

1. Bilinen tanımlama bilgilerini kullanarak doğrudan erişim

Önce bir tarayıcıyla oturum açın, tarayıcıdaki çerez dizesini alın ve ardından bunu istek başlığında kapsülleyin.

2. Simüle edilmiş oturum açma işleminden sonra oturumun açık kalması için oturumu kullanın

Oturum açma simülasyonu için oturumu kullandıktan sonra, oturum açma durumunu korumak için bir çerez otomatik olarak saklanacaktır.

3. Erişmek için Selenium + PhantomJS kullanın

Selenium kitaplığı, web sayfalarındaki giriş kutularını, düğmeleri ve diğer öğeleri bulmak için find_element (s) _by_xxx yöntemleri sağlar. Xxx, id, ad, etiket_adı (etiket adı), sınıf_adı (sınıf) veya xpath (xpath ifadesi) vb. Olabilir. Elbette web sayfasının kaynak kodu detaylı bir şekilde analiz edilmelidir.

İş parçacığı + süreç + çok iş parçacıklı

İlişki: Bir programın en az bir süreci ve bir sürecin en az bir iş parçacığı vardır.

Konu sırası:

Yeni: iş parçacığı oluşturma (t = threading.Thread (hedef = yöntem adı) veya iş parçacığı sınıfı)

Hazır: İş parçacığı başlatıldığında, iş parçacığı hazır durumuna girer ve hazır durumundaki iş parçacığı bir CPU zamanlama kuyruğuna yerleştirilir ve iş parçacığının çalıştırılmasından ve çalışma durumu haline gelmesinden cpu sorumlu olacaktır.

Çalışma durumu: CPU, hazır durumda bir iş parçacığı zamanlar ve iş parçacığı çalışma durumu olur.

Engellenmiş durum: Çalışan durumdaki bir iş parçacığı engellendiğinde ve engellendiğinde, engellenmiş durumdaki iş parçacığı çalışmaya devam etmek için yeniden hazır hale gelecektir.

Ölüm durumu: iş parçacığı yürütülmeyi bitirdi.

Çoklu iş parçacığı ve çoklu işlemenin avantajları ve dezavantajları

Çoklu okumanın avantajları:

  • Program mantığı ve kontrol yöntemi karmaşıktır;

  • Tüm iş parçacıkları doğrudan bellek ve değişkenleri paylaşabilir;

  • İş parçacığı modu tarafından tüketilen toplam kaynak, işlem modundan daha iyidir.

Çoklu kullanımın dezavantajları:

  • Her iş parçacığı adres alanını ana programla paylaşır ve 2GB adres alanıyla sınırlıdır;

  • İş parçacıkları arasındaki senkronizasyon ve kilit kontrolü zahmetlidir;

  • Bir iş parçacığının çökmesi tüm programın kararlılığını etkileyebilir;

Çoklu süreç avantajları:

  • Her süreç birbirinden bağımsızdır, ana programın kararlılığını etkilemez ve alt sürecin çökmesi önemli değildir;

  • CPU ekleyerek, performans kolayca artırılabilir;

  • Her alt işlemin 2 GB adres alanı ve ilgili kaynakları vardır ve elde edilebilecek genel performans sınırı çok büyüktür.

Çoklu işlemin dezavantajları:

  • Mantık kontrolü karmaşıktır ve ana programla etkileşime girmesi gerekir;

  • Süreç sınırını aşması gerekir.Çok miktarda veri iletimi varsa, iyi değildir.Küçük veri iletimi ve yoğun işlemler için uygundur.Çoklu işlem çizelgeleme ek yükü nispeten büyüktür.

Gerçek geliştirmede, çok iş parçacıklı ve çok işlemli seçimi, gerçek geliştirmeden seçilmelidir. Çok işlemli ve çok iş parçacığını birleştirmek en iyisidir.

Mutex ve kilitlenme ve GLF kilidi

1. Mutex

Tanım: Birden çok iş parçacığı belirli bir paylaşılan veriyi neredeyse aynı anda değiştirdiğinde, senkronizasyon kontrolü gerekir. İş parçacığı senkronizasyonu birden fazla iş parçacığının "rekabet eden kaynaklara" güvenli bir şekilde erişmesini sağlayabilir. En basit senkronizasyon mekanizması bir mutekse başvurmaktır.

İş parçacıkları, işlemin bellek alanını ve verilerini paylaştığı için, bir iş parçacığı verileri paylaşmak istediğinde, önce kilitlenir. Bu sırada, kaynağın durumu "kilitlidir" ve diğer iş parçacıkları onu değiştiremez; iş parçacığı kaynağı serbest bırakana kadar, kaynağın durumu "Kilitlenemez" hale geldiğinde, diğer iş parçacıkları kaynağı yeniden kilitleyebilir. Muteks kilidi, bir seferde yalnızca bir iş parçacığının yazma işlemine girmesini sağlar, böylece birden çok iş parçacığı durumunda verilerin doğruluğunu sağlar. Muteks bir senkronizasyon mekanizması içerir, yani iş parçacığı kaynakları bir koşul olarak serbest bırakır ve bir sonraki işlem gerçekleştirilmeden önce koşul tamamlanır. Mikroskobik bir işlemdir.

Kilitlerin faydaları:

(1) Belirli bir kod parçasının yalnızca baştan sona tek bir iş parçacığı tarafından tamamen yürütülebileceği belirlenmiştir.

(2) Global değişkenlerin güvenliği

Kilitlerin dezavantajları:

(1) Birden fazla iş parçacığının eşzamanlı olarak yürütülmesi engellenir ve bir kilit içeren belirli bir kod parçası yalnızca tek iş parçacıklı bir modülde yürütülebilir, bu da verimliliği azaltır

(2) Birden fazla kilit olabileceğinden, farklı iplikler farklı kilitler tutar ve karşı tarafın tuttuğu kilidi almaya çalışır, bu da "kilitlenmeye" neden olabilir.

2. Kilitlenme

(1) Aynı iş parçacığı kilidi iki kez çağırır.İkinci çağrıda, kilit zaten kendisi tarafından meşgul olduğu için, iş parçacığı kapanır ve kilidi açmasını bekler.İplik askıya alındığı için kilidi açma şansı yoktur. Her zaman bekleme durumunda olacak ve bir kilitlenme haline gelecektir;

(2) İplik A, kilit 1'i aldı ve iplik B, kilit 2'yi elde etti. Bu sırada, iplik A, kilit 2'yi almaya çalışmak için kilidi çağırır. Sonuç olarak, askıya alması ve B ipliğinin kilidi 2'yi serbest bırakmasını beklemesi gerekir ve B ipliği, elde etmeye çalışmak için kilidi çağırır. Kilit 1, sonuç, kilit 1'i serbest bırakmak için A iş parçacığını beklemeyi askıya almanız gerektiğidir, bu nedenle A ve B dişleri serbest bırakılmadan önce diğerinin kendilerini serbest bırakmasını bekler, bu da her ikisinin de sonsuza kadar askıda kalmasına neden olarak kilitlenmeye neden olur.

3. Neden GLF kilitleri olan karşılıklı bir dışlama kilidi var?

(1) GLF kilidi neden tasarlanmıştır?

Python tasarımının başlangıcında, yorumlayıcının ana döngüsünde aynı anda yalnızca bir iş parçacığının yürütüldüğü, yani yorumlayıcıda herhangi bir zamanda yalnızca bir iş parçacığının çalıştığı kabul edildi. Python sanal makinesine erişim, aynı anda yalnızca bir iş parçacığının çalıştığından emin olabilen genel yorumlayıcı kilidi (GIL) tarafından kontrol edilir.

(2) GLF kilidini makro ve mikro olarak düşünün?

GIL bir makro işlemdir. Örneğin, 4 çekirdekli bir ortamda, yalnızca bir çekirdek iş parçacığı çalıştırırken diğer üç çekirdek boştur. GIL süreçler için değil, iş parçacıkları için bir iş parçacığı kilididir.

MongoDB

MongoDB ile geleneksel ilişkisel veritabanları arasındaki fark:

1. Geleneksel veri tabanlarının özelliği, yapılandırılmış verileri depolamaktır.Veri satır birimleri halindedir ve her satırın veri yapısı ve türü aynıdır.

2. MongoDB belgeleri depolar ve her belgenin yapısı farklı olabilir, bu da veri elde etmeyi kolaylaştırır.

3. MongoDB koleksiyonunun önceden oluşturulmasına gerek yoktur ve dolaylı olarak oluşturulabilirken, ilişkisel veri tabanlarının tablolarının önceden tanımlanması gerekir.

4. MongoDB, zengin üçüncü taraf desteğine sahiptir. (Bu, MongoDB'nin diğer NoSQL ile karşılaştırdığı bir avantajdır).

5. MongoDB, işlem işlemlerini desteklemez.

6. MongoDB, çok fazla yer kaplayan büyük kapasiteli depolamayı destekler.

MongoDB ve SQL'in Karşılaştırması:

imleç:

Tanım: MongoDB'nin alt katmanı JS'de yazıldığı için bazı JS kodları kullanılabilir.Layman'ın terimiyle, imleç bir sorgunun sonucu değil, Python'daki oluşturucu gibi, sorgunun döndürülen kaynağı veya arayüzüdür. Bu oluşturucu aracılığıyla bunu bir kez yapabilirsiniz Her kaynağı alın.

Kalıcılık: Günlüklerin ve anlık görüntülerin karşılaştırılması

Anlık görüntü ve günlük arasında nasıl seçim yapılır?

İki tür ortak kullanım önerilir:

1. Redis yalnızca bir önbellek sunucusu olarak kullanılıyorsa, herhangi bir kalıcılık kullanmamız gerekmez.

2. Normal koşullar altında, her iki kalıcılık yöntemini de etkinleştireceğiz. Redis, verilere yanıt vermek için önce AOF dosyasını yükler. RDB'nin avantajı hızlı olmasıdır.

3. Ana ve bağımlı düğümlerde, RDB yedekleme verilerimizdir ve yalnızca kurtarma (bağımlı düğüm) üzerinde başlatılır ve senkronizasyon süresi biraz daha uzun ayarlanabilir, sadece (9001 kaydedin) kuralını koruyun.

4. AOF açıldığında, master-slave senkronizasyonu kaçınılmaz olarak IO performansında etki yaratacaktır. Şu anda, 5GB gibi auto-aof-rewrite-min-size değerini artırabiliriz. IO sıklığını azaltmak için

5. AOF olmadan, IO'nun performans etkisi kaydedilebilir.Bu, ana ve bağımlı birim arasındaki RDB aracılığıyla kalıcı senkronizasyondur, ancak ana ve bağımlı kilitlenirse, etki daha büyük olacaktır.

Dökümü rdb işlemi sırasında, AOF senkronizasyonu durdurursa kaybolur mu?

Cevap: Hayır, tüm işlemler bellek kuyruğunda önbelleğe alınır. Döküm tamamlandıktan sonra işlemler birleştirilir.

Aof yeniden yazma ne anlama geliyor?

Yanıt: Günlük tüm işlem komutlarını kaydettiğinden, depolanan günlük çok büyük olacaktır ve veritabanındaki veriler silinmiş olabilir, bu nedenle günlükteki bazı komutlar geçersize eşdeğerdir, bu nedenle önce günlük, ardından bellek silinir Veriler komutlara dönüştürülecek ve ardından aşırı AOF günlüğü sorununu çözmek için günlük dosyasına yeniden yazılacaktır.

Hem rdb dosyası hem de aof dosyası mevcutsa, verileri geri yüklemek için ilk önce kim kullanılmalıdır?

Yanıt: Bu durumda, Redis yeniden başlatıldığında, orijinal verileri geri yüklemek için ilk önce AOF dosyası yüklenecektir, çünkü normal koşullar altında AOF dosyası tarafından kaydedilen veri kümesi RDB dosyasından daha eksiksizdir.

Kurtarma sırasında hangi rdb ve aof hızlı bir şekilde kurtarılır?

Cevap: rdb hızlıdır, çünkü doğrudan belleğe yüklenen bir veri bellek haritasıdır, aof ise tek tek yürütülmesi gereken bir komuttur.

Scrapy ve Scrapy-Redis

Scrapy nedir?

Scrapy, Web sitelerini taramak ve sayfalardan yapılandırılmış verileri çıkarmak için kullanılan hızlı, yüksek seviyeli Python tabanlı bir Web tarayıcı çerçevesidir. Scrapy, ağ iletişimini yönetmek için Twisted asenkron ağ kitaplığını kullanıyor.

Scrapy genellikle veri madenciliği, bilgi işleme veya geçmiş verileri depolamayı içeren bir dizi programda kullanılır.

Hurda avantajları ve dezavantajları

avantaj:

  • Scrapy eşzamansızdır (Scrapy çerçevesinin eşzamansız mekanizması, bükülmüş eşzamansız ağ çerçevesine dayanır ve belirli eşzamanlılık değeri settings.py dosyasında ayarlanabilir (varsayılan 16 eşzamanlılıktır))

  • Normal yerine daha okunaklı xpath kullanın

  • Güçlü istatistikler ve günlük sistemi

  • Aynı anda farklı URL'lerde tarama yapın

  • Bağımsız hata ayıklama için uygun kabuk modunu destekleyin

  • Bazı birleşik filtreler yazmayı kolaylaştırmak için ara yazılım yazın

  • Veri tabanında ardışık düzen aracılığıyla depolanır

Dezavantajları:

  • Python tabanlı tarayıcı çerçevesi, zayıf ölçeklenebilirlik

  • Bükülmüş çerçeveye bağlı olarak, çalışan istisna reaktörü öldürmez ve zaman uyumsuz çerçeve bir hata oluştuktan sonra diğer görevleri durdurmaz ve veri hatalarını tespit etmek zordur.

Hurda bileşenler:

Scrapy ve scrapy-redis arasındaki fark:

Scrapy, son derece yüksek tarama verimliliği ve yüksek özelleştirmeye sahip bir Python tarayıcı çerçevesidir, ancak dağıtımı desteklemez. Ve scrapy-redis, redis veritabanına dayalı ve Scrapy çerçevesinde çalışan bir dizi bileşendir, bu da hurdalığın dağıtılmış stratejileri desteklemesine izin verir.İlave tarafı, ana taraftaki Redis veritabanında öğe kuyruğunu, istek kuyruğunu paylaşır ve parmak izi toplama talep eder.

Redis veritabanını neden seçmelisiniz? Redis, ana-bağımlı senkronizasyonunu desteklediğinden ve veriler bellekte önbelleğe alındığından, Redis tabanlı dağıtılmış tarayıcılar, isteklerin ve verilerin yüksek sıklıkta okunmasında çok yüksek verimliliğe sahiptir.

Redis'in Avantajları:

1. Veriler bellekte saklandığı için veri okuma hızlıdır

2. İşlem izleme desteği

3. Veri kalıcılığı, veri kurtarmayı kolaylaştırmak için anlık görüntüleri ve günlükleri destekler

4. Zengin veri türlerine sahip olun: list, string, set, qset, hash

5. Master-slave replikasyonunu ve veri yedeklemeyi destekleyin

6. Zengin özellikler: önbellek, mesaj kuyruğu olarak kullanılabilir, sona erme süresini belirleyebilir ve sona erdikten sonra otomatik olarak silinebilir

Dağıtılmış tarayıcı esas olarak hangi sorunu çözer?

IP, bant genişliği, CPU, io

Scrapy dağıtılmış taramayı nasıl uyguluyor?

Scrapy_redis kütüphanesi yardımı ile elde edilebilir.

Dağıtılmış taramada, bir ana makine ve bir yardımcı makine olacaktır; burada ana, çekirdek sunucu ve ikincil sunucu, belirli tarayıcı sunucusudur.

Ana sunucuda bir Redis veritabanı oluşturuyoruz ve taranacak URL'yi redis veritabanında depoluyoruz. Tüm bağımlı tarayıcı sunucuları, tarama sırasında redis veritabanından bağlanır. Scrapy_redis'in kendi kuyruk mekanizması nedeniyle, köle tarafından elde edilen URL Birbiriyle çakışmaz ve ardından taramanın sonuçları nihayet veritabanında saklanır. Ana bilgisayarın redis veritabanı, tekilleştirme için taranan URL'lerin parmak izlerini de depolar. İlgili kod dupefilter.py dosyasındaki request_seen yönteminde bulunabilir.

Zamanlanmış görevler:

1. Bir zamanlama sınıfı tasarlayabilir, zaman modülünü (zaman, tarih saat) kullanabilir, örneğin tarama sırasında geçerli saati alabilir ve ardından geçerli zamandan sonra tekrar tarayabilirsiniz.

2. Görevleri planlamak için linux crontab'ı kullanın

crontab -l tüm zamanlanmış görevleri listeler, yapılandırma dosyasında yazılı zamanlanmış görevleri göremez

crontab -e yeni zamanlanmış görev Yukarıdakilerden farkı, kullanıcı adı olmamasıdır.

crontab -r zamanlanmış görevleri temizle

Günün saati, ayın hafta sıralaması

Örneğin şunları kullanın:

* * * * * Komut Bu komutu her dakika, her saat, her gün, her ay ve her hafta çalıştırın

0-590-231-311-120-60 Evet Her gün 1-6 Pazartesiden Cumartesiye

02 * * * mysqldump yedekleme veritabanı her gün saat 2'de

02 * * 2 senkronizasyon Her Salı saat 2'de veri senkronizasyonu

08 15 * * /home/jsgz.py Maaş, her ayın 15'inde saat 8'de hesaplanacaktır

0 * / 2 * * * /home/camera.py, kamerayı görüntülemek için her 2 saatte bir yürütülür

08,12,18 * * 1-5 kq.py Her hafta 1-5, saat 8, saat 12, saat 18, saat giriş

08 * * * * spider.sh her gün saat 8'de tarar

Paletli çerçeve, modül

Python ile birlikte gelir: urllib, urllib2.

Hem urllib hem de urllib2 modülleri, URL'lerin istenmesiyle ilgili işlemler yapar, ancak farklı işlevler sağlarlar.

urllib2 .: urllib2.urlopen bir İstek nesnesini veya url'yi kabul edebilir (bir İstek nesnesi alırken ve bunu bir URL başlığı ayarlamak için kullanır), urllib.urlopen yalnızca bir url'yi kabul eder.

urllib'de urlencode vardır, urllib2 yoktur, bu nedenle her zaman urllib'dir ve urllib2 genellikle birlikte kullanılır

Üçüncü taraf: İstekler

İstekler bir HTTP kitaplığıdır, yalnızca istek yapmak için kullanılır. HTTP istekleri için güçlü bir kitaplıktır.İndirme ve ayrıştırma, daha yüksek esneklik, yüksek eşzamanlılık ve dağıtılmış dağıtım ile kendi başlarına gerçekleştirilir. Ayrıca işlevler için çok esnektir. Başarmak daha iyi.

Çerçeve: Scrapy

Scrapy, kapsüllenmiş bir çerçevedir. İndiricileri, ayrıştırıcıları, günlükleri ve istisna işlemeyi içerir. Çok iş parçacıklı ve bükülmüş işlemeye dayanır. Sabit tek bir web sitesinin gelişimini taramak için avantajları vardır, ancak birden fazla web sitesi için 100 tarar. Web sitesi, eşzamanlılık ve dağıtılmış işlem açısından, ayarlama ve genişletme açısından yeterince esnek değildir.

MyISAM ve InnoDB

MyISAM ve InnoDB motorları arasındaki fark nedir?

InnoDB işlemleri destekler, MyISAM desteklemez, bu çok önemlidir. İşlem, gelişmiş bir işleme yöntemidir. Bir dizi ekleme, silme ve değişiklik sırasında herhangi bir hata oluşursa, geri alınabilir ve geri yüklenebilir, ancak MyISAM bunu yapamaz.

MyISAM, sorgu ve ekleme tabanlı uygulamalar için uygundur ve InnoDB, yüksek güvenlik içeren sık değişiklik ve uygulamalar için uygundur.

InnoDB yabancı anahtarları destekler, ancak MyISAM desteklemez.

MyISAM varsayılan motordur, InnoDB'nin belirtilmesi gerekir.

InnoDB, FULLTEXT türü dizinleri desteklemez.

InnoDB, tablodan seçme sayımı (*) gibi tablodaki satır sayısını kaydetmez, InnoDB; kaç satır olduğunu hesaplamak için tüm tabloyu taraması gerekir, ancak MyISAM kaydedilen satır sayısını okur. MyISAM'ın ayrıca count (*) ifadesi nerede koşulları içerdiğinde tüm tabloyu taraması gerektiğini unutmayın.

Kendi kendine büyüyen alanlar için InnoDB, yalnızca bu alana sahip bir dizin içermelidir, ancak MyISAM tablosundaki diğer alanlarla ortak bir dizin oluşturulabilir.

Tüm tabloyu boşaltırken InnoDB, çok yavaş olan satır satır siler. MyISAM tabloyu yeniden oluşturacak.

Tarayıcı yazmak için birden çok işlem kullanmak daha mı iyi? Çoklu iş parçacığı kullanmak daha mı iyi? neden?

GÇ yoğun durumlarda birden çok iş parçacığı kullanılır;

Hesaplama açısından yoğun durumlarda birden çok işlem kullanın;

IO-yoğun kod (dosya işleme, web tarayıcıları vb.), Çoklu iş parçacığı, verimliliği etkili bir şekilde artırabilir (tek bir iş parçacığında GÇ işlemleri ile, GÇ beklemesi gerçekleştirilir, bu da gereksiz zaman israfına neden olur ve A iş parçacığı beklerken çoklu iş parçacığı otomatik olarak kullanılabilir İş parçacığı B'ye geçmek CPU kaynaklarını boşa harcamaz, dolayısıyla program yürütme verimliliğini artırır). Gerçek veri toplama sürecinde, yalnızca ağ hızı ve yanıt sorunları değil, aynı zamanda kendi makinenizin donanım durumu da birden çok işlemi veya birden çok iş parçacığını kurmak için dikkate alınmalıdır.

Veritabanı optimizasyonu

Neden optimize etmelisiniz?

Veritabanının işleme hızında genellikle bir uygulama çıktı darboğazı görülür. Uygulamaların kullanılması ve iş genişletme ile veritabanı verilerinin miktarı kademeli olarak artar ve veritabanı işlemesi üzerindeki baskı kademeli olarak artar. İlişkisel veritabanı verileri diskte depolanır, okunur ve yazılır Hız daha yavaştır (hafızadaki verilere kıyasla).

Optimizasyon yöntemi:

  • Tabloyu tasarlarken veritabanını kesinlikle veritabanının tasarım paradigmasına göre tasarlayın;

  • Seçtikten sonra * kullanmamaya çalışın;

  • İç içe geçmiş sorguları, birleştirme sorgularını veya sorguları kullanmamaya çalışın;

  • Mümkün olduğunca büyük harfli sql anahtar sözcükleri kullanın;

  • Mantıksal diplomasi kullanmaya çalışın ve fiziksel yabancı anahtarlar kullanmayın;

  • Sık sorgulanan alanlara dizinler ekleyin ve en soldaki ilkeyi uygulayın (tercih edilen anahtar alanını öne koymaya çalışın);

  • Dikey alt veritabanı alt tablosu: Nadiren okunan bazı verileri veya karmaşık sonuçları olan tabloları birden çok tabloya bölerek disk G / Ç işlemlerini azaltın;

  • Yatay alt veritabanı alt tablosu: Çok miktarda veriye sahip tablolar için yatay alt veritabanı alt tablosunu kullanın;

  • Sık erişilen verileri ve sık sık değiştirilmesi gerekmeyen verileri önbellekte depolamak için önbelleği kullanın; bu, disk GÇ'sini kaydedebilir;

  • Donanımı optimize edin;

  • Master-slave ayrımı okur ve yazar; master-slave replikasyonu veritabanı okuma ve yazma işlemlerini ayırmak için kullanılır.

Kullanılan ayrıştırma paketleri: Xpath, normal

Tarayıcıların durumu nasıl izlenir

(1) Tarayıcının durum güvenini belirlenen posta kutusuna göndermek için Python'un STMP paketini kullanın.

(2) Scrapyd, pyspider

(3) Günlüğü içe aktar

panadlar verileri oku

pandaları pd olarak içe aktar # Ayrıntı yükle detail = pd.read_excel ("./ meal_order_detail.xlsx") # 1. Doğrudan görünüm yöntemi sıralı dizin # İlk sütun, sonra sıra # Bulaşık_kimliği, miktarları al bulaşık_adı çok sütunlu verileri res = ayrıntı # Birden çok sütunun ilk n satırını alın res1 = detay res2 = detail.head (20) # res = detail # # Mümkün değil # res = detail # Evet # print ("Birden çok sütunun sonuçlarını alın: \ n", res) # 2. Eşzamanlı indeksleme # loc sadece isimleri kullanabilir --- Not: İsim dilimlerini kullanabilirsiniz --- sonları dahil edebilirsiniz # iloc yalnızca abonelikleri kullanabilir res3 = detail.loc # 3, ix - Eşzamanlı İndeks - Hibrit İndeks # Hem isimler hem de abonelikler kullanılabilir # res = detail.ix # res = detail.ix # Önceki satırdaki adı kullanın ve sütundaki alt simgeyi kullanın # # res = detail.ix # Yanlış, karıştırılamaz ve eşleştirilemez # print ("res: \ n", res) # Doğrudan dizin yöntemi # En hızlı # loc iloc # Orta hız # Bazı büyük platformlar yalnızca loc iloc yöntemini içerir - önerilir # ix # En düşük hız - en son sürümde silinecek

Nginx ileri proxy ve ters proxy

Web geliştirmede, dağıtım yöntemi kabaca benzerdir. Basitçe ifade etmek gerekirse, Nginx'in kullanımı esas olarak dağıtım, yönlendirme, yük dengeleme ve sunucunun baskısını paylaşmak içindir. Nginx'in kurulumu kolaydır, daha az bellek tüketir ve daha az maliyetlidir. Nginx, ileri proxy veya ters proxy olarak kullanılabilir.

Yönlendirme proxy: Talep, yerel alan ağından proxy sunucusu aracılığıyla gönderilir ve ardından İnternet üzerindeki sunucuya ulaşır. Özellikler: Sunucu gerçek istemcinin kim olduğunu bilmez.

Ters proxy: İstek İnternetten gönderilir, önce proxy sunucusuna girer ve ardından LAN'daki sunucuya iletilir. Özellikler: İstemci gerçek sunucunun kim olduğunu bilmez.

Fark: İleri vekilin amacı istemcidir. Ters proxy'nin nesnesi sunucudur.

Önbellek penetrasyonu, önbellek bozulması, önbellek çığlığı

Redis teknolojisi, NoSQL teknolojilerinden biridir, ancak Redis'in piyasaya sürülmesi, önbellek penetrasyonu, önbellek bozulması ve önbellek çığ gibi sorunlara neden olabilir.

1. Önbellek penetrasyonu:

(1) Sebep: Anahtara karşılık gelen veriler veri kaynağında mevcut değildir Bu anahtar için bir istek önbellekten her elde edilemediğinde, istek veri kaynağına gidecek ve bu da veri kaynağını etkileyebilir. Örneğin, önbellek veya veritabanı olsun, kullanıcı bilgilerini elde etmek için var olmayan bir kullanıcı kimliğinin kullanılması, bir bilgisayar korsanı bu güvenlik açığından yararlanarak saldırıya geçerse, veritabanını bunaltabilir.

(2) Çözüm:

bitmapbitmap

2.

1keyredisDBDB

2mutexload dbRedisSETNXMemcacheADDsetmutex keyload dbget

3.

1(DB)

(2)

1-5

Python

Python 0 1 0

__del

CSDNCC 4.0 BY-SA

https://blog.csdn.net/qq_40558166/article/details/103044923

Altın Üç Gümüş Dört işe alım sezonunda, başka hangi kuru mal röportaj makaleleriniz var? Kuru gıda ürünlerini paylaşmak veya görüntülemek için şunları dürtebilirsiniz:

Python'un göz kamaştırıcı operasyonu: koşullu ifadeler yazmanın yedi yolu
önceki
Doğal dil modeli algoritması çok mu dağınık? Yerel birleşik AI açık kaynak çerçevesi burada
Sonraki
5 günde 12 araca el konuldu! Rizhao Kamu Güvenliği Trafik Polisi "Sokak Sokağı" Yasadışı Eylemlerini Sıkı Bir Şekilde Araştırıyor |
Tai'an: Paidaiyue Bölgesindeki ikinci grup CPPCC organları "dört ilerlemeyi" ilerletiyor
İl Kırsal Canlandırma Hizmet Ekibi: En güzel ayak izini Rushan'da bırakın
Hong Kong Basel sizi "bulut süpürme ürünleri" çevrimiçi ticaret moduna mı yoksa "baharı" karşılamaya mı davet ediyor?
Shenzhen Yima Yolu, birkaç aydır belediye mühendisliği hasarından dolayı tamir edilmedi.
Son LPR'de faiz indirimi beklentileri düştü! Mortgage'in LPR'ye dönüştürülmesi için aylık ödeme artacak mı yoksa azalacak mı?
Namebase, GitHub geliştiricilerine para verdi, bu yeni bir yatırım mı yoksa bir yatırım dolandırıcılığı mı?
Mühendisler teknolojiden yönetime nasıl dönüşür?
Çizgi Roman: "Meme" nedir?
Luo Yonghao, borçlarını ödemek için para kazanmak için bir çapa olmaya karşılık verdi; 360 işten çıkarmaları reddediyor; Kubernetes 1.18 yayınlandı | Geek Manşet
Ali bu yıl IoT'ye tam olarak girdi Makale sonu avantajları
"Programcılar matematik yapamazlar, hiçbir şey yapamazlar!" Gelişmiş geliştirme:% 90'ı zor iş
To Top